我在寫一個簡單的MP3編目器來跟蹤哪些MP3在我的各種設備上。我打算使用MD5或SHA2鍵來識別匹配的文件,即使它們已被重命名/移動等。我並不試圖匹配在邏輯上等同的MP3(即:同一首歌,但編碼不同)。我有大約8000個MP3。其中只有約6700個生成了唯一的密鑰。Python中的MD5和SHA-2碰撞
我的問題是,無論我選擇何種哈希算法,我都會碰到碰撞。在一個案例中,我有兩個文件碰巧是同一個專輯中的曲目#1和#2,它們是不同的文件大小,但是無論使用MD5,SHA2-256,SHA2-512等,還是產生相同的散列鍵。
這是我第一次真正在文件上使用散列鍵,這是一個意外的結果。從我對這些散列算法的瞭解我感覺有點可疑。這可能是與MP3或Python的實現相關的問題嗎?
下面是我使用的代碼片段:
data = open(path, 'r').read()
m = hashlib.md5(data)
m.update(data)
md5String = m.hexdigest()
任何答案或見解,爲什麼發生這種情況,將不勝感激。提前致謝。
--UPDATE--:
我試圖執行在Linux代碼(與Python 2.6),並沒有產生衝突。正如統計調用所顯示的那樣,這些文件並不相同。我也下載了WinMD5,並沒有產生碰撞(8d327ef3937437e0e5abbf6485c24bb3和9b2c66781cbe8c1be7d6a1447994430c)。這是Windows上的Python hashlib的錯誤嗎?我在Python 2.7.1和2.6.6下嘗試了相同的結果。
import hashlib
import os
def createMD5(path):
fh = open(path, 'r')
data = fh.read()
m = hashlib.md5(data)
md5String = m.hexdigest()
fh.close()
return md5String
print os.stat(path1)
print os.stat(path2)
print createMD5(path1)
print createMD5(path2)
>>> nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=6617216L, st_atime=1303808346L, st_mtime=1167098073L, st_ctime=1290222341L)
>>> nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=4921346L, st_atime=1303808348L, st_mtime=1167098076L, st_ctime=1290222341L)
>>> a7a10146b241cddff031eb03bd572d96
>>> a7a10146b241cddff031eb03bd572d96
你確定MP3文件本身實際上是不同的嗎?散列衝突是不太可能的,特別是對於更大,更高級的算法,如SHA-1和SHA-2。有這麼多的碰撞可能只是表明你實際上有很多重複的文件。 – 2011-04-26 07:59:43
順便說一句,爲什麼你叫m.update()?米= hashlib.md5( 「foo」 的); m.update(「foo」)等同於m = hashlib.md5(「foofoo」)。 – 2011-04-26 08:06:02