【问题标题】:Platform-independent GUID generation in C++?C++ 中与平台无关的 GUID 生成?
【发布时间】:2010-10-07 07:07:48
【问题描述】:

在不依赖特定于平台的工具的情况下,以编程方式在 C++ 中生成 GUID 或 UUID 的最佳方法是什么?我正在尝试为模拟中的对象制作唯一标识符,但由于该项目是跨平台的,因此不能依赖 Microsoft 的实现。

注意事项:

  • 因为这是一个模拟器,我 真的不需要加密 随机性。
  • 最好是 32 位数字。

【问题讨论】:

标签: c++ cross-platform guid uuid


【解决方案1】:

如果您负担得起使用 Boost,那么有一个 UUID 库应该可以解决问题。使用起来非常简单——查看文档和this answer

【讨论】:

  • 这正是我所希望的。谢谢
  • 看了讨论和看代码我不禁觉得这还是很初步的。特别是,API发生变化,并且缺少基于时间的 UUID 创建。也就是说,这种方法很好,适应性强,实施也很可靠(除了一个著名的种族条件)。
  • 是的,至少有两个后续讨论 - 一个与接口、lexical_cast 等有关的问题,另一个是关于 PODness。我没有关注他们。
  • 您好,这两个问题(PODness 和 lex_cast)现在都已经解决了,而且非常优雅。 :-) 无论如何,我很高兴你首先发布了这个参考:我可以并且会充分利用它。我相信悬而未决的问题很快就会得到解决。
  • 是否可以独立于 Boost 使用该库?在我看来,将 Boost 添加到项目中,只是为了获得 Guids!
【解决方案2】:

在 linux 上:man uuid

on win:检查 msdn 中的 UUID 结构和 UuidCreate 函数

[edit] 函数看起来像这样

extern "C"
{
#ifdef WIN32
#include <Rpc.h>
#else
#include <uuid/uuid.h>
#endif
}

std::string newUUID()
{
#ifdef WIN32
    UUID uuid;
    UuidCreate ( &uuid );

    unsigned char * str;
    UuidToStringA ( &uuid, &str );

    std::string s( ( char* ) str );

    RpcStringFreeA ( &str );
#else
    uuid_t uuid;
    uuid_generate_random ( uuid );
    char s[37];
    uuid_unparse ( uuid, s );
#endif
    return s;
}

【讨论】:

  • 注意:在 Visual Studio C++ 中,“禁用语言扩展”必须设置为 NO。尽管如此,我还是得到了未解决的外部错误。我必须包含哪些库以及如何包含?
  • rpcrt4 是您需要的库。无论如何,该代码是用 gcc + mingw 编译的。
【解决方案3】:

如果您负担不起使用 Boost,那么我实现了一个非常小的库,它只是充当每个操作系统的本机 guid 实现的包装器。它应该适用于 Windows(使用 CoCreateGuid)、Linux(使用 libuuid)、MacOS(使用 CFUUID)、iOS(也使用 CFUUID)和 Android(使用对 java.util.UUID 的 JNI 调用)。 guid 生成函数在每个系统上都有不同的实现,但只有一个通用实现用于比较、字符串化和解析。

它已获得 MIT 许可,可在 GitHub 上获得:

https://github.com/graeme-hill/crossguid

【讨论】:

    【解决方案4】:

    最好只使用目标平台上存在的任何 guid/uuid。把事情做好很难(我们去购物吧;))。

    来自不同但执行良好的实现的任何两个标识符之间发生冲突的概率应该远远超出这个宇宙生命周期中发生的任何合理机会。

    【讨论】:

    • 如果你想要一个 32 位数字的唯一性(没有合作)你有问题。划分范围并根据需要分配它们是唯一的方法......
    【解决方案5】:

    GUID 生成器通常依赖于机器的硬件特性,通常是 MAC 地址或 IP。您唯一能做的绝对独立于平台的事情是使用某种PRNG 手动播种或从某个时间源播种。这通常不会生成真正的全球唯一标识符,因为您可以保证世界上没有人生成相同的数字。

    【讨论】:

      【解决方案6】:

      一个另类(?)解决方案是使用 Web 服务来获取 GUID,但我怀疑这对于 C++ 程序来说是一个很好的解决方案,尤其是在它没有启用网络的情况下。

      如果您选择使用此选项,以下网址可能会派上用场:http://www.hoskinson.net/GuidGenerator/default.asp

      【讨论】:

        猜你喜欢
        • 2012-02-27
        • 1970-01-01
        • 1970-01-01
        • 2021-12-16
        • 2019-09-24
        • 2010-12-25
        • 2011-01-08
        相关资源
        最近更新 更多