带有hashlib的MD5散列会产生不一致

时间:2015-08-03 02:00:57

标签: python hash md5

所以我需要比较两个大型数据文件集,特别是音频文件,以查看是否存在重叠。每个数据集都有50,000多个文件。所以我做的是为python创建一个主文件列表来读取,然后我的脚本打开每个文件,在文件上运行哈希并将其添加到set()。然后我可以看出这两组是否相交。相当简单,虽然计算时间很长但不关心这个问题。

现在,为了测试我的脚本,我决定在我的本地计算机上的两个不同位置复制两个带有音频的文件夹并运行我的脚本,看看是否可以了解这两个文件夹是相同的。我的代码:

hasher = hashlib.md5()

with open("/Users/tcrha/Desktop/Music/hashmaster.txt") as inFile:
    for line in inFile:
        nline = line.strip('\n')
        print nline 
        with open(nline) as handle:
            buf = handle.read()
            hasher.update(buf)
            print hasher.hexdigest()

with open("/Users/tcrha/Downloads/Music/hashmaster.txt") as inFile:
    for line in inFile:
        nline = line.strip('\n')
        print nline 
        with open(nline) as handle:
            buf = handle.read()
            hasher.update(buf)
            print hasher.hexdigest()

输出:

/Users/tcrha/Desktop/Music/Voodoo Glow Skulls/Band Geek Mafia/04 They Always Come Back.mp3
61a89ad11775654a0c469973bc3afc4a
/Users/tcrha/Downloads/Music/Voodoo Glow Skulls/Band Geek Mafia/04 They Always Come Back.mp3
ba5cbe0137dcebebd344942196e2fd5a

正如你可以看到两个哈希值不同,甚至认为它们是同一个文件。现在当我在每个上运行MD5命令时,我收到了正确的输出。

MD5 (/Users/tcrha/Desktop/Music/Voodoo Glow Skulls/Band Geek Mafia/04 They Always Come Back.mp3) = 
61a89ad11775654a0c469973bc3afc4a

MD5 (/Users/tcrha/Downloads/Music/Voodoo Glow Skulls/Band Geek Mafia/04 They Always Come Back.mp3) = 
61a89ad11775654a0c469973bc3afc4a

匹配我脚本中第一个代码块的输出。有什么我做错了。

2 个答案:

答案 0 :(得分:2)

您在程序顶部定义hasher一次,然后使用它来散列两个文件。 hashlib.md5实例计算已给出的所有字节流上的md5哈希值。因此,对于第二个文件,它返回hash(file1 + file2)而不仅仅是hash(file2)

您应该为每个散列的新文件创建一个新的hashlib.md5

答案 1 :(得分:0)

您正在重复使用hasher个对象。您需要为每个文件创建一个新文件。