ホームページ >バックエンド開発 >Python チュートリアル >Python で大きなファイルの MD5 ハッシュを効率的に計算するにはどうすればよいですか?

Python で大きなファイルの MD5 ハッシュを効率的に計算するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-20 11:29:30294ブラウズ

How to Calculate MD5 Hash of Large Files in Python Efficiently?

Python で大きなファイルの MD5 ハッシュを計算する

非常に大きなファイルを扱う場合、hashlib ライブラリを使用して MD5 ハッシュを計算する従来の方法は次のようになります。ファイル全体をメモリにロードする必要があるため、実用的ではありません。このアプローチでは、システム リソースが使い果たされ、エラーや速度低下が発生する可能性があります。

解決策: チャンク ハッシュ

この問題に対処するには、チャンク ハッシュと呼ばれる手法を使用して計算を行うことができます。 MD5 ハッシュは、ファイル全体をメモリにロードせずに段階的にハッシュします。これには以下が含まれます:

    ファイルを管理可能なサイズの小さなチャンク (例: 1 MB) に分割します。
  1. hashlib.md5() を使用して各チャンクの MD5 ハッシュを計算します。
  2. ハッシュされたチャンクを連結して、最終的な MD5 ハッシュを取得します。

コードの実装:

次の Python 関数 md5_for_file() は、チャンク ハッシュを実装します。

<code class="python">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()</code>
この関数を使用するには、必ずバイナリ モード (rb) でファイルを開いてください。

完全なメソッド:

便宜上、これは、チャンク ハッシュとファイル オープンを 1 ステップで組み合わせた完全なメソッドgenerate_file_md5()です:

<code class="python">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()</code>
このメソッドは、指定されたファイルの 16 進数でエンコードされた MD5 ハッシュを文字列として返します。比較のために jacksum などの外部ツールを使用して結果を検証できます。

以上がPython で大きなファイルの MD5 ハッシュを効率的に計算するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。