1

2 つのファイルのチェックサムを作成して比較しようとしています。これは私が使用しているスクリプトです:

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'

まず、私は出力に慣れていません。これは、他のファイルと比較するために使用できる文字列ですか? 次に、同じファイルに対してこのスクリプトを 2 回実行すると、異なる結果が得られます。パス間の経過時間に関連しているようです。ここで何が起こっているのか完全には理解できません。どんな助けでも素晴らしいでしょう。

4

3 に答える 3

3

checkF を呼び出すたびにファイルを再度開くか、 でファイル ポインタの位置をリセットする必要がありますf.seek(0)。そのため、異なるハッシュサムが得られます。最初のものはファイルの内容のハッシュであり、後のものはすべて空の文字列 (つまりda39a3ee5e6b4b0d3255bfef95601890afd80709) のハッシュサムです。

ハッシュサムを 16 進文字列として取得するには (人間が消費するため)、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 に答える