2012-03-21 5 views
1

私はそれらを比較するために2つのファイルのチェックサムを作成しようとしています。これは私が使用しているスクリプトです:2つの大きなファイルのpythonチェックサム検証

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

'checkF'でファイルを開いて閉じてみてください。 – Ben

答えて

3

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

ハッシュサムを(人間が消費するための)16進文字列として取得するには、h.digest()の代わりにh.hexdigest()を呼び出すだけで、ハッシュサムはバイト文字列として返されます(よりコンパクトですが人間が読めるわけではありません)。

0
>>> '\xda9\xa3\xee^kK\r2U\xbf\xef\x95`\x18\x90\xaf\xd8\x07\t'.encode('hex') 
'da39a3ee5e6b4b0d3255bfef95601890afd80709' 

しかし、あなたはおそらくhexdigest()を使用する代わりに、あなたは() がcheckF(F)を呼び出した後にこれを入れてください、時には、f.closeでPythonの戻り予期しない結果がファイルを閉じるのを忘れてあなたのプログラムの最後にファイルを閉じます。

-1

あなたがやった場合

+0

-1 *すべてのアプリケーション(Pythonであろうとなかろうと)がすべてのハンドルを閉じずに終了すると、すべてのオペレーティングシステムがファイルを予想通りに閉じることになります。明示的に 'f.close'を明示的に呼び出すべきではありません。代わりに、コンテキストマネージャを使用します。 – phihag

+0

コンテキストマネージャはPython> = 2.6以上で利用できるので、部分的に推奨されます。 – nickzam

関連する問題