ハッシュ関数 (ハッシュかんすう、hash function) とは、あるデータが与えられた場合にそのデータを代表する数値を得る操作、又は、その様な数値を得るための関数のこと。ハッシュ関数から得られた数値のことをハッシュ値または単にハッシュという。
またプログラミング言語の一部(Perl、Ruby等、主に高等言語とされる一般的なプログラミング言語の多く)においては、連想配列のことを伝統的にハッシュと呼ぶが、これは連想配列そのもののプログラムの内部的実装に拠るものであり、ハッシュ関数そのものとは全く異なる。連想配列はハッシュ関数の応用例の一つのハッシュテーブルの実用例である。
ハッシュの主な用途は、「高速な検索」、「データの検証」および「改竄の検出」である。以下後者の例を説明する。
例えば、「ある文書が正確かどうか検証したいが、その文書そのものを記録・比較したくない」場合を考える。ここでもしこの文書を代表する数値(文書の要約)を数学的に作り出すことができれば、この要約だけを記録し、比較すれば良いことになる。このような要約を作る操作がハッシュになる。
より具体的に、今、ハッシュ関数として、「5字ごとに1字を選択し、その列を並べたものをハッシュ値とする」という操作を選択したとすると、このハッシュ関数によって、元の文書を1/5に短縮することができる。しかしこの方法では、
うまく間に適当な文字を入れて、別の文書を作ることが出来る。
推測から元の文書も復元できてしまう事もある。
短い定型的文章では、異なる文書から同じ要約が出来てしまうこともあり得る(衝突、コリジョン)。
1万字の文章では、要約だけで2000文字になる
という問題がある。そこで、このようなことが確率論的に現実には起こりにくくなるようなハッシュ関数を工夫をする必要がある。
河川のお話
大阪情報
欧米の美術
ことわざ集
茨城の情報
せの付く言葉
惑星のお話
香り・情報
コインの秘密
知って・マナー
泌尿器科
棚田
弓道
四国
水族館
フラメンコ
昆虫
医用生体工学
上場
バイアスロン
通常は元データのバイナリ表現を使い、それを複雑に操作し数十?数百ビットのハッシュ値を作る。
改竄の検出を行う場合は、単純なハッシュ関数アルゴリズムを用いると、容易に同じハッシュ値を求めることができるため、安全に設計されたハッシュ関数を用いる必要がある。
ハッシュ関数とは、もとのデータからある一定範囲の数値を生成する関数である。理想的には、異なったデータからは常に異なったハッシュ値が得られることが望ましいが(完全ハッシュ関数)、多くの場合それは困難である。実用上のハッシュ関数は、次のような要件を満たす必要がある。
似たデータから近いハッシュ値が生成されない
あるデータとハッシュ値が等しい別のデータ(ハッシュ値の衝突(collision))が容易に生成できない
ハッシュ値に値域上の偏りがない
このため、次のような性質が求められる。
数値の各ビットが、元のデータのできるだけ多くの部分から影響を受ける
元のデータからの影響の受け方が、各ビット毎に全く異なる
ハッシュ関数は次のような技術に用いられる。
暗号化
誤り検出
改竄検出
ハッシュテーブル
擬似乱数生成器