我正在尝试创建两个文件的校验和来比较它们。这是我正在使用的脚本:
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'
首先,我不熟悉输出。这是我可以用来与其他文件进行比较的字符串吗?其次,第二次在同一文件上运行此脚本会产生不同的结果。这似乎与传球之间经过了多少时间有关。我不完全明白这里发生了什么。任何帮助都会很棒。
答案 0 :(得分:3)
每次调用checkF时都必须重新打开文件,或者用f.seek(0)
重置文件指针的位置。这就是为什么你得到不同的hashsums:第一个是文件内容的哈希值,后面的所有哈希值都是空字符串的哈希值(即da39a3ee5e6b4b0d3255bfef95601890afd80709
)。
要将hashsum作为十六进制字符串(供人类使用),只需调用h.hexdigest()
而不是h.digest()
,它将hashsum作为bytestring返回(更紧凑,但不是人类可读的)。
答案 1 :(得分:0)
>>> '\xda9\xa3\xee^kK\r2U\xbf\xef\x95`\x18\x90\xaf\xd8\x07\t'.encode('hex')
'da39a3ee5e6b4b0d3255bfef95601890afd80709'
但您可能只想使用hexdigest()
代替
答案 2 :(得分:-1)
你忘了用f.close()关闭文件 请在调用checkF(f)之后输入,如果你在程序结束时没有关闭文件,有时python会返回不可预测的结果。