在Python中比较两个文件的MD5哈希值

7
我希望比较两个文件的哈希值。但是,无论文件是否相同,即使哈希不同,比较结果也是 True。
以下是代码:
import hashlib

hasher1 = hashlib.md5()
afile1 = open('canvas.png', 'rb')
buf1 = afile1.read()
a = hasher1.update(buf1)
print(str(hasher1.hexdigest()))

hasher2 = hashlib.md5()
afile2 = open('img5.png', 'rb')
buf2 = afile2.read()
b = hasher2.update(buf2)
print(str(hasher2.hexdigest()))

print(str(a) == str(b))

输出结果:
614c9853a7f62c5b60d7d15bde80708f
76dc116b2c1b19b265db5e657846e649
True

Process finished with exit code 0
3个回答

10
作为一般规则,Python方法遵循命令-查询分离原则--因此修改对象的方法(即命令)返回None。这包括例如list.sortdict.updatehasher1.update方法也是如此。
a = hasher1.update(buf1)

None 赋值给 a。请改用

hasher1.update(buf1)
a = hasher1.hexdigest()

类似地,对于b也是如此。


import hashlib

digests = []
for filename in ['canvas.png', 'img5.png']:
    hasher = hashlib.md5()
    with open(filename, 'rb') as f:
        buf = f.read()
        hasher.update(buf)
        a = hasher.hexdigest()
        digests.append(a)
        print(a)

print(digests[0] == digests[1])

嘿,unutbu,我应该如何编辑这段代码,以便我提示选择两个文件来比较MD5散列值?我尝试使用tKinter,但出现了“TypeError:expected str, bytes or os.PathLike object, not tuple”的错误。提前致谢。如果您想查看我之前尝试过的内容(无法在回复中发布,因为它超过了字符限制),我可以创建另一个问题。 - Jaden-Dz99

1
这对我有效:

import hashlib
#File 1
hasher1 = hashlib.md5()
afile1 = open('C:/.../elephant_rgb.png', 'rb')
buf1 = afile1.read()
a = hasher1.update(buf1)
md5_a=(str(hasher1.hexdigest()))
#File 2
hasher2 = hashlib.md5()
afile2 = open('C:/.../innDay-Pic2.png', 'rb')
buf2 = afile2.read()
b = hasher2.update(buf2)
md5_b=(str(hasher2.hexdigest()))
#Compare md5
if(md5_a==md5_b):
    print("Yes")
else:
    print("No")

##No

0

我认为不必创建哈希对象。您应该直接使用 hashlib 模块中的 md5 函数。

digest = hashlib.md5(fileobj.read()).hexdigest()

所以你可以写出这样的代码:

from hashlib import md5
digests = list()
for filename in ['canvas.png', 'img5.png']:
    with open(filename, 'rb') as f:
        digest = md5(f.read()).hexdigest()
        digests.append(digest)

print(digests[0] == digests[1])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接