2009-02-12 31 views
50

什麼是在不依賴平臺特定工具的情況下以編程方式在C++中編程生成GUID或UUID的最佳方式?我試圖在模擬中爲對象製作唯一的標識符,但不能依賴微軟的實施,因爲該項目是跨平臺的。C++中與平臺無關的GUID生成?

注:

  • 由於這是一個模擬器,我 真的不需要密碼 隨機性。
  • 這是最好的,如果這是一個32位數字。
+0

的答案[問題]:http://stackoverflow.com/questions/543306/platform-independent-guid-generation-in -c給我一個更好的答案。 – 2012-09-28 00:02:13

+0

GUID [定義](https://en.wikipedia.org/wiki/Globally_unique_identifier)是128位數字。如果你願意,你總是可以從一個32位,但不能保證是唯一的,甚至是隨機的。 – 2016-12-16 15:22:26

回答

43

如果你可以負擔得起使用Boost,那麼有一個UUID庫應該可以做到。使用非常簡單 - 請查看文檔和this answer

+0

這正是我所希望的。謝謝 – 2009-02-12 21:36:42

1

一個GUID生成器通常依賴於機器的硬件特性,通常是像MAC地址或IP的東西。你唯一可以做的絕對與平臺無關的事情是使用某種手工種子PRNG或從某個時間源播種。這通常不會生成真正的全球唯一標識符,因爲您可以保證世界上沒有人能夠生成相同的編號。

2

只需使用目標平臺上的任何guid/uuid即可。這樣做很難(讓我們去購物;))。

來自不同但執行良好的實現的任何兩個標識符之間發生衝突的概率應該遠遠超過在這個宇宙的一生中發生的任何合理機會。

+1

如果你想要一個32位數的唯一性(沒有合作),你有問題。劃分範圍並根據需要分配範圍是唯一的方法... – ShuggyCoUk 2009-02-12 21:29:22

-1

那麼一個離羣(?)解決方案將使用Web服務來獲取GUID,但我懷疑這對於C++程序來說是一個很好的解決方案,特別是如果它不是網絡啓用的。

這裏是一個可能會派上用場,如果你選擇追求這個選項的URL:http://www.hoskinson.net/GuidGenerator/default.asp

34

在Linux上:在Win人UUID

:檢查出的UUID結構和UuidCreate功能MSDN

[編輯]功能會出現這樣的

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; 
} 
10

如果你不能使用升壓,然後有一個很小的溴化鋰我實現了它,它只是作爲每個操作系統的本地guid實現的包裝。它應該在Windows(使用CoCreateGuid),Linux(使用libuuid),MacOS(使用CFUUID),iOS(也使用CFUUID)和Android(使用JNI調用java.util.UUID)上工作。 guid生成函數在每個系統上都有不同的實現,但有比較,字符串化和解析的單一通用實現。

據MIT許可,可在GitHub上:

https://github.com/graeme-hill/crossguid