ハッシュ衝突とは

ハッシュ衝突とは、異なるデータ(入力値)をハッシュ関数と呼ばれる計算式に通した結果、偶然にも「全く同じハッシュ値(出力されるコード)」が生成されてしまう現象のことです。
ハッシュ関数は、どんな長さのデータからも、固定された短い長さのランダムな値(ハッシュ値)を作り出す便利な仕組みです。しかし、入力できるデータのパターンは無限にあるのに対し、出力されるハッシュ値のパターンは有限であるため、異なるデータから同じハッシュ値が生まれる可能性(衝突)はゼロにはできません。ハッシュ衝突が起きると、データの検索でエラーになったり、セキュリティ上の脆弱性に繋がったりするため、衝突したデータを別の場所に格納する仕組み(オープンアドレス法やチェイン法)が必要になります。
具体例
会員制のWebサイトで、ユーザーIDを元に特定の「ロッカー(ハッシュ値に対応する保存場所)」を割り当てるシステムを考えます。「田中さん」と「鈴木さん」という異なる名前の2人が登録した際、ハッシュ計算によって2人とも「15番のロッカー」が指定されてしまうのがハッシュ衝突です。この場合、15番にすでに荷物があるため、システムは「隣の16番に入れる(オープンアドレス法)」などの対策をとります。
もう少し詳しく
ハッシュ衝突への対策(衝突解決法)には、主に「チェイン法」と「オープンアドレス法」があります。「チェイン法(連鎖法)」では、同じハッシュ値を持つデータを「連結リスト(リンクドリスト)」を用いて数珠つなぎに保存していきます。検索時はリストをたどる必要があるため、衝突が多くなると検索速度が低下します。一方、「オープンアドレス法(開アドレス法)」は、衝突が発生した際に別の空いているハッシュアドレスを探し(再ハッシュなど)、そこにデータを保存する手法です。また、セキュリティ分野において、意図的に同じハッシュ値を持つ異なるデータを生成する攻撃を「衝突攻撃」と呼びます。暗号学的ハッシュ関数(SHA-256など)は、この衝突を実用時間内に見つけることが極めて困難である「衝突耐性(強衝突耐性および弱衝突耐性)」を備えるように設計されています。
試験でのポイント
試験では、ハッシュ衝突が起きた際のデータ格納アルゴリズムである「チェイン法」と「オープンアドレス法(オープンハッシュ法)」の特徴と違いが問われます。また、ハッシュ表(ハッシュテーブル)におけるデータの探索・挿入の時間計算量が平均して「O(1)」(定数時間)という非常に高速な性能を持つ一方、最悪の場合(すべてのデータが衝突して連結リストが一本に繋がってしまった場合など)には「O(N)」に劣化してしまう特性についても理解が必要です。さらに、ハッシュ関数の要件として、出力値が均等に分散すること(一方向性や衝突耐性)がセキュリティやデータ検索の効率性において不可欠である点も出題されます。
関連する用語
ハッシュ衝突に関連する用語としては、異なるデータを連結して保存する「チェイン法」や、空き領域を探索する「オープンアドレス法」があります。また、一方向性のデータ変換を行う「ハッシュ関数(MD5、SHA-256など)」や、データ検索を高速化する「ハッシュ表(ハッシュテーブル)」、そして暗号技術における「衝突耐性」も重要な関連概念です。