我正在使用我在 stackoverflow 上找到的以下代码,它建议是获取文本文件内容的 md5 哈希值并与我从 http://www.miraclesalad.com/webtools/md5.php 获得的生成的 md5 哈希值进行比较的有效方法。
但是.. 它没有返回相同的 md5 散列,我不确定我哪里出错了。文件内容与我用来生成 md5 哈希的文本完全匹配,因此它应该匹配,但它没有返回相同的匹配。
基本上,我想生成一些文本的 md5 哈希并将其与文本文件的内容进行比较,看它是否匹配。
def md5Checksum(filePath):
with open(filePath, 'rb') as fh:
m = hashlib.md5()
while True:
data = fh.read(8192)
if not data:
break
m.update(data)
return m.hexdigest()
如果我创建一个内容为“test”的文本文件,然后转到http://www.miraclesalad.com/webtools/md5.php并输入“test”并生成一个哈希值,然后比较它们是否不同。
无论文件内容如何,我返回的散列始终相同。
比较散列的代码
filetext = 'LOCATIONTOFILE.txt'
filemd5 = '098f6bcd4621d373cade4e832627b4f6'
if not filemd5 == md5Checksum(filetxt):
我试过打印数据,两个数据也完全一样。
来自网站的 test 哈希:098f6bcd4621d373cade4e832627b4f6
内容为test d41d8cd98f00b204e9800998ecf8427e的文本文件哈希
更新
感谢 Adam Smith 解决了这个问题。
这是一个识别错误,因此没有返回更新后的 hashlib。
请您参考如下方法:
在 Windows 上,我做了以下重现。
C:\Users\adsmith\tmp>echo test>test.txt
然后在 Python 中:
>>> import hashlib
>>> a = hashlib.md5()
>>> b = hashlib.md5()
>>> with open("test.txt", "rb") as fh:
... data = fh.read()
... a.update(data)
...
>>> with open("test.txt", "rb") as fh:
... data = fh.read().strip()
... b.update(data)
...
>>> print(a.hexdigest(), "\n", b.hexdigest())
'9f06243abcb89c70e0c331c61d871fa7' # from b'test\r\n'
'098f6bcd4621d373cade4e832627b4f6' # from b'test'
问题显然是由文件中的行终止符引起的。这也应该是一个警告,除非你必须这样做,否则不要使用像 file.read(bytecount) 这样的低级结构!
>>> open("test.txt", 'rb').read()
# b'test\r\n'
