簡體   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