2016-09-15 110 views
1

我用下面的代码我在计算器这表明发现是一种有效的方式来获得的文本文件内容的MD5哈希值,并与生成MD5哈希我从http://www.miraclesalad.com/webtools/md5.phpPython的比较

了比较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() 

如果我创建一个内容为“测试”的文本文件,也去http://www.miraclesalad.com/webtools/md5.php,键入“测试”和随后产生的哈希比较这两个他们都是不同的。

无论文件内容如何,​​我回来的散列总是相同的。

代码比较哈希

filetext = 'LOCATIONTOFILE.txt' 
filemd5 = '098f6bcd4621d373cade4e832627b4f6' 
if not filemd5 == md5Checksum(filetxt): 

我试着打印数据和两个数据都完全一样了。从网站的test

哈希:文本文件与内容test d41d8cd98f00b204e9800998ecf8427e

UPDATE

解决了该问题由于亚当·斯密098f6bcd4621d373cade4e832627b4f6

哈希值。

这是一个识别错误,所以没有返回更新hashlib。

+0

当您在测试文件上运行代码时,看到代码产生的散列会很有帮助。 – jaynp

+0

我已更新我的帖子,提供更多信息。无论文本文件的内容如何,​​我回来的散列都是一样的。 –

+0

现在我看到了......'d41d8cd98f00b204e9800998ecf8427e'是一个空文件。 :)你确定它正在读取完全相同的文件吗? – Caramiriel

回答

2

这个问题可能与换行符有关。如果您的文件以换行符"test\n"结尾,则MD5哈希将为d8e8fca2dc0f896fd7cb4cb0031ba249

无论您是在Windows还是Unix系统上,行结束符也可能不同。

2

在只有两个网发电机和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

1

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

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'