私はhashlib (Python 2.6/3.0 のmd5に代わる)を使用しましたが、ファイルを開いてその内容を関数に入れると正常に動作しましたhashlib.md5()
。
問題は、非常に大きなファイルの場合、そのサイズが RAM サイズを超える可能性があることです。
ファイル全体をメモリにロードせずに、ファイルの MD5 ハッシュを取得するにはどうすればよいですか?
ベストアンサー1
適切なサイズのチャンクでファイルを読み込む必要があります。
def md5_for_file(f, block_size=2**20):
md5 = hashlib.md5()
while True:
data = f.read(block_size)
if not data:
break
md5.update(data)
return md5.digest()
注意: 必ず「rb」を使用してファイルを開いてください。そうしないと、間違った結果が返されます。
したがって、すべてを 1 つの方法で実行するには、次のようなものを使用します。
def generate_file_md5(rootdir, filename, blocksize=2**20):
m = hashlib.md5()
with open( os.path.join(rootdir, filename) , "rb" ) as f:
while True:
buf = f.read(blocksize)
if not buf:
break
m.update( buf )
return m.hexdigest()
上記の更新は、 Frerich Raabe 氏によるコメントに基づいており、これをテストしたところ、私の Python 2.7.2 Windows インストールで正しいことが確認されました。
jacksumツールを使用して結果をクロスチェックしました。
jacksum -a md5 <filename>