ハッシュ関数とは
ハッシュ関数(Hash Function)は、任意の長さのデータを固定長のハッシュ値(ダイジェスト)に変換する一方向関数です。暗号学的ハッシュ関数は、以下の特性を持ちます:
- 一方向性:ハッシュ値から元データを逆算できない
- 衝突耐性:異なるデータから同じハッシュ値を生成することが困難
- 雪崩効果:入力の微小な変化で出力が大きく変化
- 高速:計算が効率的
代表的なハッシュ関数
| 名前 | 出力長 | 状態 |
|---|---|---|
| MD5 | 128ビット | ❌ 非推奨(衝突攻撃可能) |
| SHA-1 | 160ビット | ❌ 非推奨(衝突攻撃可能) |
| SHA-256 | 256ビット | ✅ 推奨 |
| SHA-3-256 | 256ビット | ✅ 推奨 |
| BLAKE3 | 可変 | ✅ 高速・推奨 |
AIエンジニアとしての実体験
機械学習パイプラインでハッシュ関数を多用しています:
import hashlib
# ファイルのSHA-256ハッシュを計算
def file_hash(filepath):
sha256 = hashlib.sha256()
with open(filepath, 'rb') as f:
for chunk in iter(lambda: f.read(4096), b''):
sha256.update(chunk)
return sha256.hexdigest()
# モデルファイルの整合性チェック
expected = "abc123..."
actual = file_hash("model.pt")
assert expected == actual, "ファイルが破損しています"
# 重複データの検出
data_hash = hashlib.sha256(data.encode()).hexdigest()
用途と注意点
適切な用途
- ファイル/データの整合性検証
- デジタル署名の一部
- ブロックチェーン
- キャッシュキーの生成
不適切な用途
- パスワード保存:bcrypt、Argon2を使用すべき
- 暗号化:AESなど対称暗号を使用すべき
トラブル事例と対策
⚠️ MD5/SHA-1の使用継続
リスク:衝突攻撃により偽造が可能
対策:SHA-256以上に移行。Git等のレガシー用途でも注意。
