ハッシュ関数は、いかなる長さのデータを入力しても固定長の擬似乱数データを出力する関数です。任意のデータをハッシュ関数にかけることで、別の(多くの場合は短い固定長の)値を得ることができます。

ハッシュ関数により出力されるデータをハッシュ値またはメッセージダイジェスト(要約)と言います。また、入力データをハッシュ関数の出力データに変換することをハッシュ化すると表現します。

ハッシュ化は不可逆変換で、ハッシュ値からハッシュ化前の入力データを算出することはできません。

ハッシュ値の衝突

ハッシュ関数は異なる入力データに対して同じ出力データ(ハッシュ値)となることがありえます。同じハッシュ値になることを衝突と呼びます。ただし、衝突が起こる確率は極めて低く、気にする必要はないと言えるでしょう。

以下のサイトで衝突が起こる確率を数学的に算出しています。
How hard is it to get a git hash collision?

2017年2月にGoogleとオランダのCWI研究が、SHA-1衝突に成功したと発表しました。その際は、その界隈でちょっとした話題になりました。

より良いハッシュ関数は、出力データ(ハッシュ値)がランダムな値になることと、入力データに対して出力データが予測できないことが必要です。例えば、入力データA、Bに1bitしか違いがないとしても、出力データA’、B’は大きく異なることが望ましいです。予測できてしまう場合、そのハッシュ関数は脆弱と言え、使ってはいけません。

代表的なハッシュ関数

代表的なハッシュ関数を下表にまとめます。

名称暗号強度ハッシュ長(bit)補足
MD5128脆弱。使ってはいけない
SHA-1160脆弱なアルゴリズムとされており非推奨
SHA-2224、256、384、512ハッシュ長によりSHA-224、SHA-256、SHA-384、SHA-512とも言う。SHA-224は暗号強度が比較低いため推奨されない

ハッシュ関数の具体例

各ハッシュ関数の入力データと出力データの対応例は以下サイトから確認できます。出力データが入力データから予測しづらいこと、二つの入力データ間の差が少しであっても出力データの差が大きいことがわかると思います。

下表は「こんにちは」という文字列をハッシュ関数にかけた場合のハッシュ値です。

アルゴリズムハッシュ値文字数
MD5c0e89a293bd36c7a768e4e9d2c5475a832文字
SHA-120427a708c3f6f07cf12ab23557982d9e6d23b6140文字
SHA-256125aeadf27b0459b8760c13a3d80912dfa8a81a68261906f60d87f4a0268646c64文字
SHA-512bb2b0b573e976d4240fd775e3b0d8c8fcbd058d832fe451214db9d604dc7b3817f0b1b030d27488c96fc0e008228172acdd5e15c26f6543d5f48dc75d8d9a662128文字

「こんにちは」という文字列からは予想もつかないまったく別の文字列が生成されていることがわかります。これがハッシュ値です。