3秒でわかる
任意の長さのデータから決まった長さの値を作る関数。同じ入力からは必ず同じ値が出る性質を使い、辞書の高速化や改ざん検知、パスワード保管に使われます。
もう少し詳しく
どういうものか
ハッシュ関数は、どんな長さの入力を与えても、決まった長さの値(ハッシュ値、ダイジェスト)を返す関数です。1 文字でも入力が変われば出力は大きく変わり、出力からもとの入力を復元することは想定されていません。
大事な性質は 3 つあります。同じ入力からは必ず同じ出力が出ること、出力の長さが入力によらず一定であること、そして出力が偏らず散らばることです。
なぜ必要か
用途によって、求める性質が変わります。
データ構造としては、鍵から配列の位置を一瞬で計算するために使います。辞書(Python の dict、JavaScript の Map)が要素数によらずおおむね O(1) で引けるのはハッシュ関数のおかげです。
セキュリティの文脈では、ファイルが途中で書き換えられていないかの検証や、パスワードを平文で保存しないための仕組みに使います。データベースが漏れても、ハッシュ値からもとのパスワードを逆算するのは現実的でない、という前提に立っています。
具体例
import hashlib
digest = hashlib.sha256("harenohi".encode()).hexdigest()
print(digest) # 常に同じ 64 桁の 16 進数
print(hash("harenohi") % 8) # 辞書の格納位置を決める<a href="/glossary/image" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">イメージ</a>
# 自作の単純なハッシュ (原理の確認用)
def simple_hash(s, size):
total = 0
for ch in s:
total = (total * 31 + ord(ch)) % size
return total
print(simple_hash("coffee", 16))hashlib のような暗号学的ハッシュと、dict が内部で使う高速なハッシュは目的が別物です。
つまずきやすいところ
hash() の値が毎回違うと驚く — 文字列のハッシュは起動ごとにランダム化されており、プロセスをまたいで保存する用途には使えません似た用語との違い
| 用語 | 戻せるか | 主な用途 |
|---|---|---|
| ハッシュ関数 | 戻せない | 検索、改ざん検知、パスワード保管 |
| 暗号化 | 鍵があれば戻せる | 通信や保存データの秘匿 |
| エンコード | 誰でも戻せる | Base64 など形式の変換 |
覚え方
「入れたら二度と出てこない、けれど同じものを入れれば同じ札が出るクローク」と考えます。札(ハッシュ値)を見せ合えば同じ荷物かどうかは分かる、という点が本質です。