Web教材一覧ハードウェアとソフトウェア

ハッシュ

学習のポイント

ハッシュという用語は、ハッシュ検索や電子メールの電子署名など、いろいろなところで出てきます。

キーワード

ハッシュ、ハッシュ値、ハッシュ関数、シノニム、衝突


ハッシュとは、ある項目の値を、一定の規則に従って変換することです。その変換規則をハッシュ関数、変換された値をハッシュ値といいます。ハッシュの代表的な利用分野に、電子メールでの暗号化とデータベースでの検索がありますが、内容はやや異なります。ここでは後者を中心に説明します。

暗号方式での利用

電子メールなどの暗号化や電子署名でのハッシュは、電文が改ざんされていないかどうかを調べるのに使います。
 長い電文を何らかの方法で変換(現実ではないが、「あ」を1、「い」を2などとして、全体を加算した値とするなど)して短いビット列にしたものをハッシュ値あるいはダイジェストといいます。電文が改ざんされるとハッシュの値が変わるはずです。受信者が送られてきた電文のハッシュ値を計算し、それが送られてきたハッシュ値と一致していれば、改ざんされていないことがわかります。
 この場合、当然ハッシュ値も暗号化されていますが、ハッシュ値を求める方法-ハッシュ関数-は、オープンなものでないと困ります。

検索での利用

例えば、得意先コードや商品コードは何らかの規則によってコード化されています。そのため、実際のデータ量よりもはるかに大きな桁数になっています。例えば得意先コードは、管理区分1桁、地域2桁、業種2桁、通し番号3桁からなる8桁であるとすれば、1億の得意先が設定できることになりますが、実際の得意先数は数万以下であるというのが通常でしょう。
 得意先マスタファイルを直接編成ファイルにするとき、得意先コードをそのままアドレスとしたのでは、磁気ディスクに無駄が生じます。それで、得意先コードを何らかの変換をして、それをアドレス(ハッシュ値)として格納することが必要になります。
 単に格納効率を高めるのであれば、極端には全体の通し番号をアドレスにすればよいのですが、得意先コードを与えて該当するデータ(レコード)を取り出す検索処理が多く行われます。検索効率を高めるには、得意先コードから簡単に変換できることが重要になります。それで、適切なハッシュ関数を設定することが重要なのです。

適切なハッシュ関数

以下は、検索利用でのハッシュに限定します。
 格納効率を高めるためには、ハッシュ値のとりうる範囲が狭いこと(最大値が小さいこと)が求められます。また、検索効率を高めるには、変換が高速に処理できることが求められます。これらは互いにトレードオフの関係にあります。
 異なる得意先コードなのにハッシュ値が同じになる(シノニムという)と、同じ場所に格納することになってしまいます(衝突という)。理想的にはシノニムが発生しないことが望ましいのですが、現実には困難です。それで、シノニムが発生したときには、それらを線形リストとして保存する「直接連鎖法」や空いているハッシュ値にデータを振り分ける「オープンアドレス法」などがあります。いずれにせよ、検索効率が悪くなるので、なるべくシノニムが発生しないような関数にすることが望まれます。
 得意先コードでは、ある業種が多いとか、通し番号では小さい番号が多いなど、偏りがあります。シノニムを少なくするには、似たデータから近いハッシュ値が生成されないようにする(ハッシュ値の値がばらつくようにする)のが適切です。それで、ハッシュ関数では、ハッシュ値の上限Mを設定して、コードをMで割ったときの剰余をハッシュ値とするような方式がよく用いられます。