在不依赖特定于平台的工具的情况下,以编程方式在C ++中生成GUID或UUID的最佳方法是什么?我试图在模拟中为对象创建唯一标识符,但不能依赖Microsoft的实现,因为项目是跨平台的。
注意:
答案 0 :(得分:45)
如果你有能力使用Boost,那么有一个UUID库应该可以解决问题。它非常简单易用 - 请查看文档和this answer。
答案 1 :(得分:38)
在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;
}
答案 2 :(得分:14)
如果你不能使用Boost,那么我实现了一个非常小的库,它只是作为每个操作系统的本机guid实现的包装器。它应该适用于Windows(使用CoCreateGuid
),Linux(使用libuuid
),MacOS(使用CFUUID
),iOS(也使用CFUUID
)和Android(使用JNI)致电java.util.UUID
)。 guid生成函数在每个系统上都有不同的实现,但是有一个用于比较,字符串化和解析的通用实现。
它是MIT许可的,可在GitHub上获得:
答案 3 :(得分:2)
最好只使用目标平台上的guid / uuid。做得很难(让我们去购物;))。
来自不同但执行得很好的实现的任何两个标识符之间发生冲突的概率应远远超出此宇宙生命周期中发生的任何合理机会。
答案 4 :(得分:1)
GUID生成器通常依赖于机器的硬件特性,通常是MAC地址或IP等。您可以做的唯一绝对平台独立的事情是使用某种PRNG手动播种或从某个时间源播种。这通常不会生成真正的全局唯一标识符,因为您可以保证世界上没有人生成相同的数字。
答案 5 :(得分:-1)
一个不同寻常的(?)解决方案是使用Web服务获取GUID,但我怀疑这对于C ++程序来说是一个很好的解决方案,特别是如果它不是网络启用的。
如果您选择使用此选项,以下网址可能会派上用场:http://www.hoskinson.net/GuidGenerator/default.asp