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

C+中独立于平台的GUID生成+;? 什么是最好的方式来编程生成GUID或UUID在C++中而不依赖于平台特定的工具?我试图在模拟中为对象创建唯一标识符,但不能依赖Microsoft的实现,因为该项目是跨平台的,c++,cross-platform,guid,uuid,C++,Cross Platform,Guid,Uuid,注: 因为这是一个模拟器,我 不需要加密 随机性 最好是32位数字 GUID生成器通常依赖于机器的硬件特性,通常是MAC地址或IP之类的东西。你能做的唯一一件绝对独立于平台的事情就是使用某种手动种子或从某个时间源种子。这通常不会生成真正的全局唯一标识符,因为您可以保证世界上没有人生成相同的数字。仅使用目标平台上存在的任何guid/uuid是最好的。把它做好很难(让我们去购物吧) 来自不同但执行良好的实现的任意两个标识符之间发生冲突的概率应该远远超过在这个宇宙的生命周期中发生冲突的任何合理机会。

注:

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

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

仅使用目标平台上存在的任何guid/uuid是最好的。把它做好很难(让我们去购物吧)


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

如果您能够负担得起使用Boost,那么有一个库可以做到这一点。使用文档非常简单,但是,

< p>很好的一个另类解决方案是使用Web服务来获取GUID,但我怀疑这对于C++程序来说是一个好的解决方案,尤其是如果它没有网络化的话。 这里有一个URL,如果您选择使用此选项,它可能会派上用场:

在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;
}
extern“C”
{
#ifdef WIN32
#包括
#否则
#包括
#恩迪夫
}
std::string newUUID()
{
#ifdef WIN32
UUID-UUID;
uuid创建(&uuid);
无符号字符*str;
UuidToStringA(&uuid,&str);
std::字符串s((char*)str);
RpcStringFreeA&str;
#否则
uuid_t uuid;
uuid_生成_随机(uuid);
chars[37];
uuid_unparse(uuid,s);
#恩迪夫
返回s;
}

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

它是MIT授权的,可在GitHub上使用:


如果您想要32位数字的唯一性(无需合作),您就有问题了。划分范围并根据需要分配它们是唯一的方法…这正是我所希望的。感谢阅读讨论和查看代码,我无法阻止这种感觉,这仍然是非常初步的。特别是,API将发生变化,并且缺少基于时间的UUID创建。这就是说,该方法是好的,适应性强,实现是可靠的(除了一个著名的种族条件)。是的,至少有两个后续讨论-一个是与接口、词汇广播等相关的问题,另一个是关于PODness。我没有跟着他们。嗨,安,这两个问题(PODness和lex_cast)现在都已经解决了,而且非常优雅。:-)不管怎样,我很高兴你一开始就发布了这个参考资料:我可以而且会充分利用它。我相信这些悬而未决的问题将很快得到解决。是否可以独立于Boost使用该库?在我看来,仅仅为了获得guid,对一个项目来说,它似乎太过重了,以至于不能给项目增加动力!注意:在VisualStudioC++中,“禁用语言扩展”必须设置为No,但仍然存在未解决的外部错误。我必须包含哪些库,以及如何包含?rpcrt4是您需要的库。那段代码是用gcc+mingw编译的。关于
rpcrt4.lib
链接问题:[问题]的答案:给我一个更好的答案。GUID是一个128位的数字。如果你愿意,你可以从一个数据中提取32位,但不能保证它是唯一的,甚至是随机的。