2010-10-20 35 views
10

假設我想設置一個GUID作爲我的應用程序的組裝GUID。從互聯網搜索,我們可以使用(new Guid()).Next()獲得新的獨特價值。如何確保生成的GUID在全球獨一無二?

我不明白我的guid是如何保證獨一無二的?請解釋一下,如果你知道如何。

+0

這可能有幫助:http://stackoverflow.com/questions/39771/is-a-guid-unique-100-of-the-time – Reza 2017-05-07 05:31:29

回答

3

http://en.wikipedia.org/wiki/Globally_unique_identifier

算法

在用於產生新的(V1)的GUID的OSF-指定的算法,用戶的網絡卡的MAC地址被用作基地最後一組的GUID數字,其意味着,例如,文檔可以追溯到創建它的計算機。定位Melissa蠕蟲的創建者時使用了這個隱私漏洞[2]。大多數其他數字都是基於生成GUID時的時間。

V1包含MAC地址和時間的GUID可通過第三組數字的第一位數字「1」來標識,例如{2f1e4fc0-81fd-11da-9156-00036a0f876a}。

V4 GUID使用後面的算法,它是一個僞隨機數。這些在同一位置有一個「4」,例如{38a52be4-9352-453e-af97-5c3b448652f0}。更具體地說,'data3'位模式在第一種情況下將是0001xxxxxxxxxxxx,而第二種情況下是0100xxxxxxxxxxxx。 WinAPI GUID生成器的密碼分析表明,由於V4 GUID的序列是僞隨機的;在充分了解內部狀態的情況下,可以預測之前和之後的值。[3]。

6

你的唯一保證是,概率就在你身邊。 2^128個可能的GUID以及創建過程中的一些聰明點使得您不可能看到重複。

看來V4現在是Windows上的標準GUID。如果那個純粹基於僞隨機數生成器,正如維基百科似乎表明的那樣,它受Birthday problem的影響。

我見過幾個使用128位的例子來表明重複幾乎是不可能的。那些經常錯過兩件事。生日問題和V4 GUID實際上是124位。

您需要1/2+sqrt(1/4-2*2^124*ln(0,5)) ≈ 5.4*10^18 GUID纔能有50%的重複機會。這仍然很多,但50%可能不是你要找的交易。假設你想讓它成爲百萬分之一以獲得重複,那麼你可以有sqrt(2*2^124*ln(1/(1-0,000001)))≈6.5* 10^15個GUID。如果您每秒創建一千個GUID,則可能會在接近206667年的時間內繼續這樣做,然後再達到一百萬到一百萬的複製風險。 6,52191054316287e15/(3600*24*365,25*1000) ≈ 206666,874006986

我得到所有這些計算的機會正確→0。