使用 hashlib 进行 MD5 散列会产生不一致

MD5 hashing with hashlib produces inconsistencies

所以我需要比较两个大型数据文件集,特别是音频文件,看看是否有重叠。每个数据集包含 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

这与我脚本中第一段代码的输出相匹配。是不是我做错了什么。

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

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

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