「ハッシュ」と呼ばれるものがいくつかありますが、それらは密接に関連しています。ちょうどRubyにも、そのような事情を知れるメソッドがあります。
hashの原義
hashを英和辞典で引くと、「細切れにする」というような意味があります。ハッシュドビーフやハッシュドポテトというような料理を考えてみれば、わかりやすいと思います。
ハッシュ関数
「ハッシュ関数」と呼ばれる関数がありますが、これは、上に述べたようにデータを「細切れにして」何かしらの値を取り出す関数です。もちろん、でたらめに行うのではなく、同じ値を与えれば同じ値を返すような関数です。ハッシュ関数が返す値を「ハッシュ値」といいます。あるハッシュ関数については、どんな入力を与えても、一定のビット数でハッシュ値を返します。
ハッシュ関数の用途
ハッシュ関数には、いくつかの用途があります。大雑把にまとめてしまえば、多種多様なデータを、「ハッシュ値」という統一したものでハンドリングできるようになる、ということです。
暗号化目的
たとえば、文書が改竄されていないかをチェックするに当たって、何メガバイトもある全文に対して処理するより、僅かなビット数のハッシュ値に対して操作するほうが容易ですし、また適切なハッシュ関数を選べば、ハッシュ値から元の値に関する情報を得られないようにすることもできます。
SSL証明書の電子署名も、証明書全体ではなく、ハッシュ値に対して行っています。少し前にSHA-1からSHA-2への切り替えというのが話題となりましたが、この2つもハッシュ関数の名称です。
データ区分・検証用
たとえばGitでは、コミットのIDにSHA-1の結果を利用しています。また、ISOファイルなどの配信サイトで、本体ファイルとは別にSHA-1などのハッシュ値が置いてあって、壊れずにダウンロードできたかをチェックできるようになっていることがあります。
ハッシュテーブル
連想配列の内部構造として、キーのハッシュ値を取って、それを基準に格納する方法があって、「ハッシュテーブル」と呼ばれます。
Perlではこのような実装から連想配列自体が「ハッシュ」と呼ばれるようになったほか、Rubyでも連想配列はHash
クラスです。
ハッシュ関数の性質
ハッシュ関数が持つべき性質にはいろいろあります。まずは、全く別なデータでハッシュ値が一致すること(衝突)が少ないほうが好ましいです。ハッシュテーブルでも衝突が起きれば効率は落ちますし、暗号化系ではハッシュが衝突する別な文書を容易に見つけられるようだとデータの改竄ができてしまいます。また、エラー検出・暗号系に使うようなハッシュ関数では、元データが少し書き変わればハッシュ値が違うものになる、という必要があります(そうでないと役に立ちません)。
また、暗号用のハッシュ関数では、ハッシュ値がわかっても元のデータに関する情報が得られないなど、高度な要件が必要となります。
RubyでのObject#hash
Rubyには、ルートクラスのObject
にhash
メソッドがあって、連想配列(Hash
)のキーとして使う場合に、ハッシュ値として利用されます。