我仍然不能斷定Guid可以安全地用作唯一標識符。維基百科頁面上說我可以安全地使用Guids創建多少個ID?
鍵的總數...非常大,相同數字隨機生成兩次的概率可以忽略不計。
我的問題是,我可以安全地生成多少個Ids,直到概率變得不可忽略?我的意思是,必須有一個限制,正確的(至多是鴿子的限制)?
如果Guid生成的實現有所不同,那麼讓我們假設.NET Guid。
我仍然不能斷定Guid可以安全地用作唯一標識符。維基百科頁面上說我可以安全地使用Guids創建多少個ID?
鍵的總數...非常大,相同數字隨機生成兩次的概率可以忽略不計。
我的問題是,我可以安全地生成多少個Ids,直到概率變得不可忽略?我的意思是,必須有一個限制,正確的(至多是鴿子的限制)?
如果Guid生成的實現有所不同,那麼讓我們假設.NET Guid。
我自己做了一個測試運行,一個星期後,一個TB的GUID仍然沒有重複。
See here有一個概率的想法。
據我所知,Guids
在每臺機器上的生成方式都不相同,這意味着如果您現在在機器上開始創建它們,您將永遠不會冒險創建與onether機器相同的機器。
如果你真的想強調這一點,你可以開始創建它們並將它們存儲在該列上具有唯一索引的數據庫中,並查看在檢測到第一個衝突之前要插入多少行,我想應用程序將運行幾次至少幾年。
編輯:
它具有相同的範圍內的IPv6地址,這是我一直在IPv6上找到:
128位的地址空間。換句話說,理論上有 340,282,366,920,938,463,463,374,607,431,768,211,456地址 可用。這意味着我們這個星球上每平方米的地址大約有6.67 * 10^27個IPv6 個地址。
你認爲db表中的6.67 * 10^27記錄足夠了嗎?那麼在這個星球的每一平方米里,我們都有一臺計算機產生它自己的GUIDS,還有海洋,撒哈拉沙漠等......我想我們可以認爲這個獨特的足夠。
我在這個問題上想要的是技術分析,它讓你到達「幾年」的猜測 –
@Louis:對於技術分析,請看我的回覆中的生日問題鏈接。這給你提供了一個很難的數學。 –
Re「'Guids'在每臺機器上生成不同」:適用於UUID版本1的不再使用。 – svick
嚴格來自維基百科Random UUID probability of duplicates。
它描述了具有122個有意義比特的java.util.UUID的衝突概率。 NET中的System.Guid儘管使用了所有的128位,但本文會給你一些aproximations。
換句話說,只有一點產生十億的UUID每秒未來100年後,創建只有一個重複的概率會約50%。如果地球上的每個人擁有6億個UUID,則一個重複的概率約爲50%。
你確定'System.Guid'有128位隨機數嗎?我認爲它總是會創建一個版本4 UUID,這意味着爲版本規範保留10位。 – svick
@Svick:不,這不是真的隨機。有一些結構,並有幾個不同的版本。見http://en.wikipedia.org/wiki/Globally_unique_identifier –
有幾種不同的方法來生成GUID。一些實現比其他實現更強大。一個好的GUID實現接近一個隨機的128位數字,這意味着在GUID中有2個到128個不同的狀態(約爲38的3.4倍)。算法通常不是完全隨機的,可能包含有關GUID生成時間和/或生成機器的時間的信息。
通過比較,估計有9×10到observable universe的21顆星。
如果你有38次狀態的10倍到38個狀態,並且你想檢查一個(可能很大的)狀態樣本以查看是否有任何兩個狀態是相同的,那就是Birthday Problem。如果你仔細觀察數學,你會發現確實需要非常大量的樣本纔能有兩個GUID相同的有意義概率(如果GUID生成方法包含關於機器和/或生成時間的信息,這對GUID可以產生的位置有進一步的限制)。
我最近爲一組1,000,000個數據點做了哈希碰撞的數學計算,發現有40位,哈希碰撞的概率非常非常低。對於128比特,散列衝突(對於相同的1,000,000個數據點)的可能性爲天文上的低。
這是奉獻精神,先生。 –