計算機科学における
ハッシュ関数は、データから固定長の値を生成する関数です。この値は、データの識別や検索に利用されます。しかし、
ハッシュ関数の性質上、異なるデータから同じハッシュ値が生成されることがあります。これを「衝突」と呼びます。
衝突の概要
衝突は、多くの場面で望ましくない現象です。例えば、
ハッシュテーブルでは、衝突が発生すると、データの検索に余計なコストがかかります。また、ファイルのフィンガープリントでは、異なるファイルが同じフィンガープリントを持つと、ファイルの同一性を誤認する可能性があります。
しかし、衝突が意図的に利用される場合もあります。例えば、類似したデータを同一視したい場合、
ハッシュ関数は似たデータに対して似たハッシュ値を生成するように設計されます。また、音声ファイルやDNA配列など、内容が類似しているデータの比較では、衝突を利用してデータの同一性を判定することができます。
衝突の種類と影響
チェックサム
チェックサムは、データの誤りを検出するために利用される
ハッシュ関数の一種です。チェックサムは、データのビットの化けや抜けを検出するために、入力データが少しでも異なると、大きく異なるハッシュ値を生成するように設計されます。これにより、データが破損しているかどうかを検出することができます。
ハッシュテーブルは、キーと値を関連付けるデータ構造です。
ハッシュ関数を使用してキーからテーブル内の位置を計算します。衝突が発生すると、同じ位置に複数のデータが格納されることになり、検索効率が低下します。衝突を解決するために、様々な手法が用いられます。例えば、連鎖法やオープンアドレス法などがあります。
プロキシサーバやバックアップシステム
プロキシサーバやバックアップシステムでは、ファイルの内容を比較するためにフィンガープリントが利用されます。この場合、衝突が発生すると、本来は異なるファイルを同じものとして扱ってしまう可能性があります。これは、転送コストの削減やストレージ効率の向上のために利用されますが、衝突が発生すると、本来は転送や保存する必要がないファイルを転送・保存してしまう可能性があります。また、
暗号学的
ハッシュ関数を使用すれば、衝突の可能性は低くできますが、その可能性をゼロにすることはできません。
暗号学的
ハッシュ関数は、高い衝突耐性を持つように設計された
ハッシュ関数です。これらの関数は、データの改ざんを検出したり、デジタル署名を作成したりするために利用されます。
暗号学的
ハッシュ関数は、「弱衝突耐性」と「強衝突耐性」という2つの性質を持つ必要があります。「弱衝突耐性」とは、あるデータに対して、同じハッシュ値を持つ別のデータを見つけることが困難である性質を指します。「強衝突耐性」とは、任意の2つの異なるデータに対して、同じハッシュ値を持つデータを見つけることが困難である性質を指します。
ハッシュ関数は、データを特定のレコード位置にマッピングするために使用されます。この際、異なるデータが同じレコード位置にマッピングされると、シノニムが発生します。例えば、データ「1, 5, 7, 12, 13」を11で割った余りをレコード位置とする
ハッシュ関数を考えると、データ1と12はどちらもレコード位置1にマッピングされます。このように、異なるデータが同じ位置にマッピングされることを「シノニムが生じる」と言います。情報処理では、シノニムが発生した場合の処理方法や、シノニムを発生させない方法をあらかじめ考慮しておく必要があります。
まとめ
ハッシュ関数における衝突は、避けることが難しい現象ですが、その影響は利用目的によって異なります。
暗号学的
ハッシュ関数のように、衝突耐性が重視されるものもあれば、意図的に衝突を利用するものもあります。
ハッシュ関数を利用する際には、その性質を理解し、適切に利用することが重要です。