2017-09-06 22 views
-1

我有關於md5函數的唯一性的問題。md5的一部分有多獨特?

我知道MD5(與microtime中值)不是唯一的,但是,他們是相當獨特的:)

我如何計算MD5散列值的兩個部分之間發生碰撞的概率是多少?

例如:在PHP生成從MD5結果的8個字符的字符串以下:

substr(md5(microtime()), 0, 8); 

第二種情況 - 如果它的索引是唯一的(因此它的散列的不同部分每一次)?

substr(md5(microtime()), rand(0, 32), 8); 
+3

這是幹什麼用的?如果你想要一個隨機字符串,有更好的方法。 –

+0

絕對。我意識到這不是產生獨特字符串的方式。它只是出於好奇 –

回答

0

當您詢問字符串的唯一性時,它實際上是一個概率。意味着你將使用盡可能多的字符串字符,並且儘可能多的隨機字符串的長度會減少獲得類似隨機字符串的機會。

因此,要獲得唯一的字符串,你需要存儲字符串中的數據塊,並隨機字符串比較,如果你發現了類似的然後新的新鮮串又來了,直到你得到唯一的字符串。

+0

謝謝,你是對的。然而,我很好奇這些概率,而不是關於如何創建一個更好的算法。我說了8個字符長度的字符串的2場景.. –

0

這取決於你要多少「子哈希」生成和你有多少位從原來的MD5哈希(「子散」的長度)一致。如果只生成1個子哈希並保留1位,則根本不會發生衝突。如果您生成2個子哈希會有50%的衝突。使用2位,賠率爲25%。你做數學。參閱生日悖論更多信息

1

有8個十六進制數字2^32個組合。即使它們是完全隨機的,平均而言,只能生成約65000個這樣的字符串,然後才能得到2個相同的字符串。

MD5(),使用隨機指數與否,並不顯著只要改變任何東西,因爲所有microtime中()值使用用途是唯一的。但是,如果您生成的速度太快,或者跨越多臺機器,則情況會更糟糕,因爲您很可能最終會使用相同的microtime()值兩次。