在C ++平台无关的GUID生成?
什么是在不依赖平台特定工具的情况下以编程方式在C ++中生成GUID或UUID的最佳方式? 我正在尝试为仿真中的对象创build唯一的标识符,但不能依赖微软的实现,因为项目是跨平台的。
笔记:
- 由于这是一个模拟器,我不需要密码随机性。
- 这是最好的,如果这是一个32位数字。
如果你能负担得起使用Boost,那么就有一个UUID库应该可以做到这一点。 这是非常简单的使用 – 检查文档和这个答案 。
在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生成函数在每个系统上都有不同的实现,但有比较,string化和parsing的单一通用实现。
这是麻省理工学院许可,并在GitHub上提供:
在目标平台上简单地使用任何guid / uuid是最好的。 做对了很难(让我们去购物))。
来自不同但执行良好的任何两个标识符之间发生碰撞的概率应该远远超过在这个宇宙的一生中发生的任何合理机会。
一个GUID生成器通常依赖于机器的硬件特性,通常是像MAC地址或IP的东西。 唯一可以做的绝对与平台无关的事情是使用某种PRNG手工播种或从某个时间源播种。 这通常不会生成真正的全球唯一标识符,因为您可以保证世界上没有人能够生成相同的编号。
那么一个不同的(?)解决scheme将是使用Web服务来获取GUID,但是我怀疑这对C ++程序来说是一个很好的解决scheme,特别是如果它没有启用networking的话。
这里是一个url,如果你select这个选项可能会派上用场: http : //www.hoskinson.net/GuidGenerator/default.asp