ハッシュ関数で遊んでみた
完了しました

ビットコインなどの取引を管理するのに使われる「ブロックチェーン」という技術がありますが、これを理解するのはなかなか骨です。どうしたら理解できるだろうかと考えていたら、ある金融系エンジニアの知人が「ハッシュ関数が分かれば、ブロックチェーンはすぐ分かるよ」と言いました。ハッシュ関数はブロックチェーンの根幹を支える技術だそうです。というわけで私も、ハッシュ関数なるもので遊んでみることにしました。遊んでみるだけでいろんなことが理解できるようになりましたので、今日はその報告をします。
ハッシュ関数とは、ある任意の文字列を入力すると、決まった長さの数値を返してくれる関数のことで、パスワードの暗号化などにつかわれています。Python(パイソン)という、いま流行しているプログラミング言語があって、これで4行の簡単なプログラムを書けば、ハッシュ関数を呼び出せました。
ハッシュ関数と一言で言っても、いろんな種類があります。今回はSHA256というハッシュ関数で遊ぶことにしました。これは実際にビットコインのブロックチェーンに使われている由緒正しい(?)ものだそうです。
ハッシュ関数は文字列を数値に変換できる
ハッシュ関数は、今述べたように、任意の文字列を一定の長さの数値(数字)に変換してくれるので、ここでは文字列として、「読売新聞」のローマ字表記の「yomiurishimbun」と入力してみました。すると、びっくり。次のような長い値が返ってきました。
1fb77fc675f5e889b85e360d04c0926a6af7a23ddab8bb85273b1a9f7eae5171
数字とローマ字のゴニョゴニョした羅列で、これが「数値」かと疑問に思われるかもしれませんが、これは16進数の数字です。16進数は、0から9までの10個の数字と、数字の代用としてaからfまでの6個の文字を使います。だから上の数字とローマ字の羅列は、16進数の数字であり、れっきとした数値なのです。ハッシュ関数で得られた値なので、ハッシュ値といいます。
一方、「これに何の意味があるの?」と思われる方もいるかもしれません。任意の文字列を、一定の長さの数値に変換することに、いったい何の意味があるのでしょうか? 実は深い意味があるのです。
ハッシュ関数の第一の特徴は、同じ文字列を入力すると必ず同じハッシュ値を返してくるけれど、ほんの1文字違うだけで、似ても似つかないハッシュ値を返してくることです。つまり、文字列の改ざんを簡単に見抜くことができるのです。
本当にそうなのでしょうか? 試しにもう一度、同じ「yomiurishimbun」と入力してみましょう。
1fb77fc675f5e889b85e360d04c0926a6af7a23ddab8bb85273b1a9f7eae5171
はい、先ほどと同じ値が返ってきました。同じ文字列には同じハッシュ値が返ってきます。では、今度は先ほどの文字列の後半部分、shimbunのmをnに書き換えて、1文字だけ変えた文字列「yomiurishinbun」を入力してみます。どうなるでしょうか?
51171a6221efffc2b34075cd975716ef1b78289feff90749ecbb3f46c4fa8082
おっ、さっきとは違う値に変換されました。それも少し違うのではなくて、見た目が全然違います。今度は、hを抜いて「yomiurisinbun」と入力してみましょう。すると、
2a832d8a9e715968935296282c89a54b734dc15d21bef6eba0b28cdb558219b1
また、全然違う値に変わりましたね。
今回の例では、元々が「yomiurishimbun」という短い文字列なので、1文字変えたら変わったことが目視で分かるでしょう。しかし、ものすご~く長い文字列の場合、1文字変えたとしても、変わったかどうか、目で確認するのは大変な労力と時間が必要になります。