私の現在のアプローチはこれです:
def get_hash(path=PATH, hash_type='md5'):
func = getattr(hashlib, hash_type)()
with open(path, 'rb') as f:
for block in iter(lambda: f.read(1024*func.block_size, b''):
func.update(block)
return func.hexdigest()
i5 @ 1.7 GHz で 842MB の iso ファイルの md5sum を計算するには、約 3.5 秒かかります。ファイルを読み取るさまざまな方法を試しましたが、いずれも結果が遅くなります。おそらく、より速い解決策はありますか?
編集: hashlib でサポートされているほとんどのハッシュ関数のデフォルトは(「sha384」と「sha512」を除く - それらの場合、デフォルトは) であるため、 2**16
(内のf.read()
) をに置き換えました。したがって、ブロック サイズは同じ (65536 ビット) のままです。1024*func.block_size
block_size
64
block_size
128
EDIT(2): 何か間違ったことをしました。3.5 秒ではなく 8.4 秒かかります。:(
EDIT(3): 関数を再度実行したとき、どうやら Windows は +80% でディスクを使用していたようです。実に3.5秒かかります。ふぅ。
別の解決策 (~-0.5 秒、わずかに速い) は、os.open() を使用することです。
def get_hash(path=PATH, hash_type='md5'):
func = getattr(hashlib, hash_type)()
f = os.open(path, (os.O_RDWR | os.O_BINARY))
for block in iter(lambda: os.read(f, 2048*func.block_size), b''):
func.update(block)
os.close(f)
return func.hexdigest()
これらの結果は最終的なものではないことに注意してください。