Pythonで大きなファイルのMD5ハッシュを取得する 質問する

Pythonで大きなファイルのMD5ハッシュを取得する 質問する

私は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>

おすすめ記事