在不依赖特定于平台的工具的情况下,以编程方式在 C++ 中生成 GUID 或 UUID 的最佳方法是什么?我正在尝试为模拟中的对象制作唯一标识符,但由于该项目是跨平台的,因此不能依赖 Microsoft 的实现。
笔记:
- 因为这是一个模拟器,我真的不需要密码随机性。
- 最好是 32 位数字。
在不依赖特定于平台的工具的情况下,以编程方式在 C++ 中生成 GUID 或 UUID 的最佳方法是什么?我正在尝试为模拟中的对象制作唯一标识符,但由于该项目是跨平台的,因此不能依赖 Microsoft 的实现。
笔记:
在 Linux 上:man uuid
on win:查看 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 上获取:
最好只使用目标平台上存在的任何 guid/uuid。做对是困难的(我们去购物吧;))。
来自不同但执行良好的实现的任何两个标识符之间发生冲突的概率应该远远超出在这个宇宙的生命周期中发生的任何合理机会。
GUID 生成器通常依赖于机器的硬件特性,通常是 MAC 地址或 IP。您唯一可以做的绝对独立于平台的事情是使用手动播种或从某个时间源播种的某种PRNG 。这通常不会生成真正的全球唯一标识符,因为您可以保证世界上没有人生成相同的数字。
一个另类(?)解决方案是使用 Web 服务来获取 GUID,但我怀疑这对于 C++ 程序来说是一个很好的解决方案,尤其是在它没有启用网络的情况下。
如果您选择使用此选项,这里有一个 URL 可能会派上用场:http: //www.hoskinson.net/GuidGenerator/default.asp