【はっしゅてーぶる】

ハッシュテーブル とは?

💡 「棚番号を計算して一発で取り出す」超高速な引き出しシステム
📌 このページのポイント
ハッシュテーブル(Hash Table) キー "apple" "banana" "cherry" ハッシュ関数 h(key) → index バケット(配列) 0 apple: 150 1 (空) 2 cherry: 300 3 banana: 200 4 (空) 衝突時 同じindex → 連結 リストで 計算量(平均) 探索: O(1) 挿入: O(1) 削除: O(1) 用途例:辞書型(dict / Map)・キャッシュ・データベースインデックス
キーをハッシュ関数で変換し、高速にデータへアクセスする構造
ひよこ ひよこ

ハッシュテーブルって何が速いの?

ペンギン先生 ペンギン先生

「田中」という名前を探すとき、普通の方法は全員のリストを先頭から確認する。ハッシュテーブルは「田中」という文字を計算して「この棚の番号」を一発で出し、その棚に直接取りに行く。だから1件でも100万件でも検索時間がほぼ変わらないんだ。

ひよこ ひよこ

おもしろい!Pythonのdictもハッシュテーブルなの?

ペンギン先生 ペンギン先生

そうだよ。Pythonのdictはハッシュテーブルで実装されているから「dict['key']」で値を取り出すのがO(1)で速い。JavaScriptオブジェクトやMapも同様。日常的に使っているデータ構造がハッシュテーブルだったりするんだ。

ひよこ ひよこ

衝突って何?どうなるの?

ペンギン先生 ペンギン先生

異なるキーを計算したら同じ棚番号になってしまうことを衝突(コリジョン)という。棚が一つしかないのに二つのものを入れようとする問題だよ。「チェイニング(リストで繋ぐ)」や「オープンアドレス法(別の空き棚を探す)」で解決する。衝突が多くなると速度が落ちるから、ハッシュ関数の設計が重要なんだ。

ひよこ ひよこ

ハッシュテーブルの弱点って何?

ペンギン先生 ペンギン先生

データの順序が保持されないこと。「最初に入れた要素」「最後に入れた要素」を取り出したいならハッシュテーブルでは難しい。Pythonのdictは3.7以降挿入順序を保持するようになったけど、これは実装の工夫であってハッシュテーブル本来の性質ではないんだ。順序が必要ならLinkedHashMap(Java)やOrderedDict(Python)を使うよ。

ひよこ ひよこ

ハッシュテーブルの攻撃ってあるの?

ペンギン先生 ペンギン先生

あるよ。ハッシュ衝突攻撃(Hash DoS)といって、意図的に同じハッシュ値になるキーを大量に送り込むと、衝突が連鎖してO(1)のはずがO(n)に劣化してサーバーが極端に遅くなる。2011年に多くのWebフレームワークで問題になって、以降はランダム化ハッシュ(起動ごとにハッシュ関数のシードを変える)が標準的な対策として導入されたんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ハッシュテーブル」って出てきたら「キーから保存場所を即計算して超高速に検索できるデータ構造」と思えばだいたいOK!
📖 おまけ:英語の意味
「Hash Table」 = ハッシュ(細切れにした)表
💬 「Hash(細切れにする)」はもともと料理用語で、キーを細かく変換して番号にする様子から命名。「ハッシュドポテト」のハッシュと同じ単語だよ
← 用語集にもどる