我正在编写一个简单的 MP3 编目器来跟踪我的各种设备上的 MP3。我计划使用 MD5 或 SHA2 密钥来识别匹配文件,即使它们已被重命名/移动等。我不想匹配逻辑上等效的 MP3(即:相同的歌曲但编码不同)。我有大约 8000 个 MP3。其中只有大约 6700 个生成了唯一密钥。
我的问题是,无论我选择哪种散列算法,我都会遇到冲突。在一种情况下,我有两个文件恰好是同一张专辑中的 #1 和 #2,它们的文件大小不同,但无论我使用 MD5、SHA2-256、SHA2-512 等,它们都会产生相同的哈希键......
这是我第一次真正在文件上使用哈希键,这是一个意想不到的结果。从我对这些哈希算法的了解很少,我觉得这里发生了一些可疑的事情。这可能是与 MP3 或 Python 的实现有关的问题吗?
这是我正在使用的代码片段:
data = open(path, 'r').read()
m = hashlib.md5(data)
m.update(data)
md5String = m.hexdigest()
任何关于为什么会发生这种情况的答案或见解将不胜感激。提前致谢。
--更新--:
我尝试在 linux(使用 Python 2.6)中执行此代码,但没有产生冲突。正如 stat 调用所证明的,这些文件并不相同。我还下载了 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