2010-06-04 78 views
71

我知道存在衝突的可能性很小,但是如果我生成了一批1000個GUID(例如),是否可以安全地假設它們都是唯一的以便保存每個測試的測試?假設一個GUID始終是唯一的是否安全?

獎金問題

測試一個GUID的唯一性的最佳方式是什麼?布隆過濾器可能?

+2

[GUID是否100%時間是唯一的?](http://stackoverflow.com/questions/39771/is-a-guid-unique-100-of-the-time) – ChrisF 2010-06-04 20:31:34

+20

不是我們都會繼續在本站點上重新加載按鈕:http://www.wasteaguid.info/ – mipadi 2010-06-04 20:32:04

+9

我把所有的錯誤歸咎於GUID碰撞。它必須發生一段時間嗎? – Michael 2010-06-04 20:34:57

回答

257

是的,可以。由於GUID是128位長,所以出現衝突的可能性很小 - 但「分」這個詞遠不夠強。有這麼多GUID,如果你隨機產生幾萬億,你更有可能被隕石擊中,甚至碰到一次碰撞(從Wikipedia)。如果您不是隨機生成它們的,但是例如使用MAC地址和時間戳算法,那麼它們也將是唯一的,因爲MAC地址在計算機中是唯一的,並且時間戳在您的計算機上是唯一的。

編輯1:要回答你的獎金問題,測試一組唯一GUID的最佳方法是假設它們都是唯一的。爲什麼?因爲,鑑於您生成的GUID數量,GUID碰撞的機率比計算機內存中宇宙射線翻轉一點點的機率要小,並且由您關心的任何「準確」算法給出答案跑步。 (數學見this StackOverflow answer

有一個巨大的在那裏的GUID數量。引述道格拉斯·亞當斯的漫遊指南銀河:。

「空間,」它說,「大真大,你就不會相信它是多麼千差萬別巨大mindbogglingly大我的意思是,你可能認爲這是一個很長的路下山的路向化學家,但是這只是花生空間,聽......」

而且因爲有about 7×1022 stars in the universe,和不到2點128點的GUID,則有大約4.86×10 -almost five quadrillion -GUIDs爲每一顆恆星。如果這些明星中的每一個都擁有像我們這樣蓬勃發展的世界,那麼圍繞每一顆明星,將有權獲得超過四萬五千個GUID。對於宇宙中每顆恆星的歷史上的每一個人。 GUID空間與整個宇宙的大小處於同一水平。你做不是需要擔心。

編輯2:反思這一點:哇,我沒有意識到自己什麼這意味着GUID空間是不可思議的海量我的敬畏它是排序的。)

+68

引用搭便車的+1 – 2010-06-04 21:20:20

+0

此外,WolframAlpha報告說,對於每個曾經住過的人的每個細胞,有36萬億個UUID。你身上有大約10^14個細胞,有1065億人曾經生活過。或者,美國公共債務中的每一分錢都有2.385 * 10^23個UUID。 – new123456 2011-08-11 01:47:14

+4

雖然數字仍然很高,但GUID衝突的概率在2^64 GUID處超過50%。 – NullUserException 2012-10-22 23:23:52

0

雖然碰撞是可能的,但這是不太可能的。 (數學here。)假設它們實際上是不同的是安全的。

5

一般來說,是的,它是安全的假設。

如果您的GUID生成器是真正隨機的,1000個GUID內衝突的可能性非常小。

當然,這假設一個很好的GUID生成器。所以問題是關於您對用於生成GUID的工具的信任程度以及是否有自己的測試?

4

在Wikipedia上可以找到碰撞可能性的分析:http://en.wikipedia.org/wiki/Uuid#Random_UUID_probability_of_duplicates

正如在鏈接中提到的那樣,這將受到隨機數生成器的屬性的影響。

GUID生成器代碼中還存在一個bug的可能性;雖然機會很低,但它們可能高於基於數學的碰撞機會。

布隆過濾器可能是適當的;它可以快速告訴你,如果一個GUID是唯一的,但是有可能錯誤地指示碰撞。如果您一次測試批次,則另一種方法是對批次進行排序並比較每個連續的元素。

30

簡答:爲了實際目的,是的。

但是,你必須考慮生日悖論!

我計算了一些有代表性的碰撞概率。使用the Wikipedia article中指定的122位UUID,如果至少生成了2.71492e18 UUID,則碰撞概率爲1/2。使用10^19個UUID,概率爲0.999918。有10^17個UUID,0.000939953。

Some numbers for comparison can be found on Wikipedia.因此,您可以安全地爲每個已經居住的人,可觀察宇宙中的每個星系,海洋中的每條魚以及地球上的每隻螞蟻分配一個UUID。 但是,如果您爲一年內人類產生的每個晶體管,地球上的每個昆蟲,地球上的每顆沙子,可觀察宇宙中的每顆恆星或任何更大的物體生成UUID,碰撞幾乎可以確定。

如果您每秒產生10億個UUID,則可獲得10%的碰撞概率it would take about 36 years

最終,在人類歷史過程中產生的一組UUID可能會發生碰撞。儘管如此,UUID碰撞的概率將被用於相同的目的,但實際上並沒有問題。

+0

這就是宇宙結束......一些程序員只是假設他們的GUID對於他們的巨型死星來說總是唯一的...... – pkr298 2018-02-26 22:04:42

相關問題