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

笔记:

  • 由于这是用于模拟器,因此我真的不需要加密随机性。
  • 最好是 32 位数字。
有帮助吗?

解决方案

如果你有能力使用 Boost,那么有一个 通用唯一识别码 应该可以解决这个问题的库。使用起来非常简单 - 检查文档并 这个答案.

其他提示

在Linux上:手动uuid

获胜时:在 msdn 中查看 UUID 结构和 UuidCreate 函数

[编辑]该函数将如下所示

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;
}

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

它已获得 MIT 许可并可在 GitHub 上获取:

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

最好只使用目标平台上存在的任何 guid/uuid。正确地做起来很难(让我们去购物吧;))。

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

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

好吧,一种另类(?)的解决方案是使用 Web 服务来获取 GUID,但我怀疑这对于 C++ 程序来说是否是一个好的解决方案,特别是如果它没有启用网络。

如果您选择采用此选项,下面的 URL 可能会派上用场: http://www.hoskinson.net/GuidGenerator/default.asp

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top