Python でハッシュ値 (MD5/SHA-1/SHA-256/SHA-512) を求める (`hashlib`)

Python の hashlib 標準ライブラリを使用すると、いろいろなタイプのハッシュ値を求めることができます。

バイトデータのハッシュ値を求める

あるバイトデータのハッシュ値を求めるには、hashlib.sha1hashlib.sha256 などのコンストラクタでハッシュオブジェクトを生成し、hexdigest メソッドで 16 進数表記のハッシュ値を取得します。 次の例では、MD5、SHA-1、SHA-256 アルゴリズムを使って、b"HelloWorld" というバイトデータのハッシュ値を計算しています。

バイトデータのハッシュ値を求める
import hashlib

print(hashlib.md5(b"HelloWorld").hexdigest())
print(hashlib.sha1(b"HelloWorld").hexdigest())
print(hashlib.sha256(b"HelloWorld").hexdigest())
実行結果
68e109f0f40ca72a15e05cc22786f8e6
db8ac1c259eb89d4a131b253bacfca5f319d54f2
872e4e50ce9990d8b041330c47c9ddd11bec6b503ae9386a99da8584e9bb12c4

ハッシュ計算に使用するバイトデータは、update メソッドで追加していくことができます。

hash = hashlib.sha1()
hash.update(b"Hello")
hash.update(b"World")
print(hash.hexdigest())  # => db8ac1c259eb89d4a131b253bacfca5f319d54f2

# 以下のようにバイトデータを結合してから update しても結果は同じ
hash = hashlib.sha1()
hash.update(b"Hello" + b"World")
print(hash.hexdigest())  # => db8ac1c259eb89d4a131b253bacfca5f319d54f2

文字列のハッシュ値を求める

文字列のハッシュ値を求めるには、エンコーディング形式を指定して、どのようなバイトデータとして扱うかを明確にする必要があります。 次の例では、文字列の encode メソッドで UTF-8 形式のバイトデータを取得しています。

文字列のハッシュ値を求める
import hashlib

str = "HelloWorld"
bytes = str.encode(encoding="utf-8")

print(hashlib.md5(bytes).hexdigest())
print(hashlib.sha1(bytes).hexdigest())
print(hashlib.sha256(bytes).hexdigest())
実行結果
68e109f0f40ca72a15e05cc22786f8e6
db8ac1c259eb89d4a131b253bacfca5f319d54f2
872e4e50ce9990d8b041330c47c9ddd11bec6b503ae9386a99da8584e9bb12c4

ファイルのハッシュ値を求める

以下の file_sha256 関数は、指定したファイルの内容からハッシュ値を求めています。 ハッシュ値の計算にはバイトデータが必要なので、ファイルオープン時にバイトモード ("b") を指定するのがポイントです。

import hashlib

def file_sha256(filename: str) -> str:
    """
    ファイル内容の SHA-256 ハッシュ値を計算し、16 進数文字列として取得します。
    """
    with open(filename, mode="rb") as f:
        binary = f.read()
        return hashlib.sha256(binary).hexdigest()

        # Python 3.11 以降では次のようにも記述できます
        # return hashlib.file_digest(f, "sha256").hexdigest()

print(file_sha256("sample.py"))
実行結果
d727c62744e193aa6a0d0728e2dc78c0221bd77da2599dc6f86d17a46aa0bea4

使用可能なアルゴリズムの一覧

alogrithms_guaranteed (必ず使えるアルゴリズム)

すべてのプラットフォーム使用できることが保証されているアルゴリズムの一覧は、hashlib.algorithms_guaranteed で参照できます。

import hashlib

for name in sorted(hashlib.algorithms_guaranteed):
    print(name)
実行結果(Python 3.10 の場合)
blake2b
blake2s
md5
sha1
sha224
sha256
sha384
sha3_224
sha3_256
sha3_384
sha3_512
sha512
shake_128
shake_256

ここに列挙された名前を使って、hashlib.new("sha256") のようにハッシュオブジェクトを生成することができます。 ただし、hashlib.sha256() のような、専用のファクトリー関数が定義されている場合はそちらを使った方が効率的です。

algorithms_available (現在のシステムで使えるアルゴリズム)

現在のシステムで使用できることができるアルゴリズムの一覧は、hashlib.algorithms_available で参照できます。 前述の hashlib.algorithms_guaranteed に含まれているアルゴリズムは、この一覧にも必ず含まれています。

for name in sorted(hashlib.algorithms_available):
    print(name)
実行結果
blake2b
blake2s
md4
md5
md5-sha1
mdc2
ripemd160
sha1
sha224
sha256
sha384
sha3_224
sha3_256
sha3_384
sha3_512
sha512
sha512_224
sha512_256
shake_128
shake_256
sm3
whirlpool

hashlib.algorithms_available にしか含まれていないアルゴリズムを抽出したい場合は、次のようにセット演算を行います(参考: set オブジェクトで集合演算を行う)。

import hashlib

only_in_available = hashlib.algorithms_available - hashlib.algorithms_guaranteed
for name in sorted(only_in_available):
    print(name)
実行結果
md4
md5-sha1
mdc2
ripemd160
sha512_224
sha512_256
sm3
whirlpool

関連リンク