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