2013-09-27 98 views
3

對於學習的目的,它將是有用的,找出多少次,我可以編寫一個md5函數本身沒有得到相同的值我可以自己編寫一個md5函數多少次?

這是一個鹽的補充/補充方法,因爲這種方式的價值變得更難以使用蠻力破解。

+1

你的意思是像'而( foo!= md5(foo)){foo = md5(foo)}'?雖然現在md5毫無用處,但我懷疑它是如此根本破壞以至於'foo == md5(foo)'永遠是真的。 –

+0

這在數學上是不可能的。 MD5關係集是有限的。結果,你會返回比關係中更多的元素。 (16^32值)有很多值,但這正是我的問題的重點:我可以做多少次? –

+0

任何其他的統計/數據/研究(例如sha1)都是有用的。 –

回答

4

看似無限。但是MD5已經被證明不是collision resistant,所以在某些時候你會有一個重複的。

以下Ruby代碼將循環應用MD5散列算法,直到檢測到重複爲止,此時它將打印達到重複點所需的週期數。原始字符串是從字母字符中隨機生成的。

require 'set' 
require 'digest' 

keys = Set.new 

o = [('a'..'z'), ('A'..'Z')].map { |i| i.to_a }.flatten 
string = (0...10).map{ o[rand(o.length)] }.join 
count = 0 

while !keys.include?(string) do 
    count += 1 
    puts count 
    keys << string 
    string = Digest::MD5.digest(string) 
end 

puts "#{count}" 

這繼續運行超過15mil週期...我會更新一旦發現重複。

更新:由於我的機器的資源有限,我不得不停止75933338個週期後,上面的腳本,而不發生碰撞(下集已在內存中分配〜8 GB)

+0

這似乎是測量它的一種有用方法,但也許在光盤上使用樹狀數據類型。 –

+1

沒有任何證據,但是好的傳聞證據和一個很好的答案。 – Gray

+0

我只是想說明在真實世界的試驗中真正產生重複是多麼困難。 – aren55555

相關問題