Python比较md5哈希

时间:2016-09-15 20:23:22

标签: python hash md5sum

我正在使用我在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。

4 个答案:

答案 0 :(得分:2)

问题可能在于换行。如果您的文件以换行符"test\n"结尾,则MD5哈希值为d8e8fca2dc0f896fd7cb4cb0031ba249

无论您使用的是Windows系统还是Unix系统,行结尾也会有所不同。

答案 1 :(得分:2)

在Web生成器和Python中只有test的文本(后面没有空白行),我得到的MD5哈希:

098f6bcd4621d373cade4e832627b4f6

如果我之后添加回车/新行(\ n),我会得到:

d8e8fca2dc0f896fd7cb4cb0031ba249 # Using the web site

9f06243abcb89c70e0c331c61d871fa7 # Using a Windows machine

d8e8fca2dc0f896fd7cb4cb0031ba249 # Using a Linux machine

差异是由回车/换行的类型引起的。 DOS / Windows ('\r\n') - Linux ('\n')

http://www.cs.toronto.edu/~krueger/csc209h/tut/line-endings.html

答案 2 :(得分:1)

你确定你的大小参数足够大(我无法想象它不会,但值得检查)?当我用一个简单的值测试上面的代码并与标准的MD5哈希(使用miraclesalad或其他)进行比较时,我得到了正确的响应。回车或特殊字符也可能是一些问题。

答案 3 :(得分:1)

在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'