2016-09-15 67 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'