1

我正在尝试创建两个文件的校验和来比较它们。这是我正在使用的脚本:

import hashlib
import datetime
f = open('myfile.mov', 'rb')
def checkF(f, block_size=2**20):
...     print datetime.datetime.now()
...     h = hashlib.sha1()
...     while True:
...             data = f.read(block_size)
...             if not data:
...                     break
...             h.update(data)
...     print datetime.datetime.now()
...     return h.digest()
... 
>>> checkF(f)
2012-03-21 09:33:40.704032
2012-03-21 09:33:40.704490
'\xda9\xa3\xee^kK\r2U\xbf\xef\x95`\x18\x90\xaf\xd8\x07\t'

首先,我不熟悉输出。这是我可以用来与其他文件比较的字符串吗?其次,第二次在同一个文件上运行这个脚本会得到不同的结果。这似乎与通过之间经过了多少时间有关。我不完全明白这里发生了什么。任何帮助都会很棒。

4

3 回答 3

3

每次调用 checkF 时都必须重新打开文件,或者用 . 重置文件指针的位置f.seek(0)。这就是你得到不同哈希和的原因:第一个是文件内容的哈希,后面的都是空字符串的哈希和(即da39a3ee5e6b4b0d3255bfef95601890afd80709)。

要将哈希和作为十六进制字符串(供人类使用),只需调用h.hexdigest()而不是h.digest(),它将哈希和作为字节字符串返回(更紧凑,但不是人类可读的)。

于 2012-03-21T00:34:30.590 回答
0
>>> '\xda9\xa3\xee^kK\r2U\xbf\xef\x95`\x18\x90\xaf\xd8\x07\t'.encode('hex')
'da39a3ee5e6b4b0d3255bfef95601890afd80709'

但是您可能只想hexdigest()改用

于 2012-03-21T00:34:30.983 回答
-1

你忘了用 f.close() 关闭文件 请在调用 checkF(f) 之后放这个,如果你在程序结束时没有关闭文件,有时 python 会返回不可预知的结果。

于 2012-03-21T00:36:44.150 回答