繁体   English   中英

在 C++ 中生成独立于平台的 GUID?

[英]Platform-independent GUID generation in C++?

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

笔记:

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

如果您负担得起使用 Boost,那么应该有一个UUID库可以解决问题。 使用起来非常简单 - 检查文档和这个答案

在 linux 上: man uuid

在 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 上获得:

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 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM