Python の hashlib 標準ライブラリを使用すると、いろいろなタイプのハッシュ値を求めることができます。
バイトデータのハッシュ値を求める
あるバイトデータのハッシュ値を求めるには、hashlib.sha1
や hashlib.sha256
などのコンストラクタでハッシュオブジェクトを生成し、hexdigest
メソッドで 16 進数表記のハッシュ値を取得します。
次の例では、MD5、SHA-1、SHA-256 アルゴリズムを使って、b"HelloWorld"
というバイトデータのハッシュ値を計算しています。
ハッシュ計算に使用するバイトデータは、update
メソッドで追加していくことができます。
文字列のハッシュ値を求める
文字列のハッシュ値を求めるには、エンコーディング形式を指定して、どのようなバイトデータとして扱うかを明確にする必要があります。
次の例では、文字列の encode
メソッドで UTF-8 形式のバイトデータを取得しています。
ファイルのハッシュ値を求める
以下の 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"))
使用可能なアルゴリズムの一覧
alogrithms_guaranteed (必ず使えるアルゴリズム)
すべてのプラットフォーム使用できることが保証されているアルゴリズムの一覧は、hashlib.algorithms_guaranteed
で参照できます。
import hashlib
for name in sorted(hashlib.algorithms_guaranteed):
print(name)
ここに列挙された名前を使って、hashlib.new("sha256")
のようにハッシュオブジェクトを生成することができます。
ただし、hashlib.sha256()
のような、専用のファクトリー関数が定義されている場合はそちらを使った方が効率的です。
algorithms_available (現在のシステムで使えるアルゴリズム)
現在のシステムで使用できることができるアルゴリズムの一覧は、hashlib.algorithms_available
で参照できます。
前述の hashlib.algorithms_guaranteed
に含まれているアルゴリズムは、この一覧にも必ず含まれています。
for name in sorted(hashlib.algorithms_available):
print(name)
hashlib.algorithms_available
にしか含まれていないアルゴリズムを抽出したい場合は、次のようにセット演算を行います(参考: set オブジェクトで集合演算を行う)。
import hashlib
only_in_available = hashlib.algorithms_available - hashlib.algorithms_guaranteed
for name in sorted(only_in_available):
print(name)