1997 年頃だったか、マイクロソフトが 「ActiveX」 というインターネットの新しい技術を発表した。今我々が使っているインターネットエクスプローラーという名前のブラウザも、この頃初期のバージョンが発表された。
我々技術者は、その新しい技術を使ってソフトを開発しなければならなくなった。マイクロソフトのずさんなセキュリティのために、全世界のウィンドウズを使うユーザーは現在、ウィルス付きメールや月に 1度のパッチを充てなければならないという煩わしさに悩まされ続けているが、すべてはここから始まった。
この頃、マイクロソフトはそれぞれのソフトウェアに世界で一意(=ユニークな)番号を与えるから、それを使え、と言い出した。
世界中のプログラマは、個人や企業に関わらず、ウィンドウズのプログラムを作ったら、そのプログラムを識別するために番号を付けるのだ。
ちょっとパソコンに詳しい人なら、ウィンドウズの 「レジストリ」 というコトバを聞いたことがあるだろう?実は、そこにソフトの番号がたくさん貯められているのだ。
しかしすぐにこんな質問が思いつく。
「いったい誰がどうやって他のプログラムとバッティングしないように番号を振るのか?」
まず自分で勝手に振ったら、世界で無数にあるウィンドウズのソフトの番号とバッティングしそうだ。それは容易に想像できる。
では、マイクロソフトにいちいち申請をして番号を振ってもらうのか?オンラインですべて自動で行われたとしても、ちょっと面倒だ。マイクロソフト自身もそんな番号を管理するのはコストがかかって仕方ないだろう。
実はマイクロソフトは、自社のソフトウェア開発のためのソフト(ソフトを作るソフト)が、自動的に番号を振るから、それを使え、といっていた。
そんなことが可能なのだろうか?世界で、本当に自分しか所有しない番号、、しかも誰ともその番号を調整しないで・・・
このとき、ウィンドウズのソフト開発に非常に詳しい同僚に質問してみたが、実は上の説明をされただけで、どうしてそうなるのかまでは説明してもらえなかった。しかし、今ならその仕組みを説明できる。ヒントは、件名にある「ハッシュ」だ。まずはググってみよう。
上では、マイクロソフトが「世界で唯一の番号を各人が作ったソフトに自動的に割り振る」という話をした。
実際にそんなことは可能なのだろうか?答えは、「事実上」 可能なのである。事実上と、枕詞がつく理由は、「十分に実用的に耐えうる」からである。
それには、このメールのタイトルのハッシュというものを使う。
中高で 「関数」 を習ったが、ハッシュとは関数の一種だ。
この関数は特殊で、A というものを入れると B というものが出てくるが、一度 A を B に変換してしまうと、元のAには絶対に戻せない、というものだ。戻せないというより、元のAは何だったかわからない、といった方が正しい。
たとえば 1234 を入力すると 7890 が出てくるような感じである。7890 から 1234 を復元する方法はこの世に存在しない。1234 を入力すると必ず決まった値である 7890 が出てくるもので、1234 を入力したときの 7890 という値は、この世の中で(おそらく)あなたの他に誰も 7890 という値を持っていないものである。
では 1234 から 7890 どうやって計算するのか?というと、複雑な計算手順が必要らしく、実は私にもわからない。ひとつ言えるのは世界で唯一の数字はどんなものか?と少し考えると、「時刻」 があると思う。その計算をした瞬間の時刻をそのまま数値化すれば、あなたとまったく同じ計算をした人はおそらくいないだろうから、時刻は唯一であると言える、というものだ。
しかしやはり本当にその瞬間に全世界で同じ計算をした人が存在しないかと言われたら、ひょっとしたらいるかも知れない。だから、時刻という値はハッシュであることの最有力候補であるけれども、もっともっとバラバラな数字が必要だ。だからハッシュを計算する関数、つまりハッシュ関数はもっと複雑な計算を行い、その出力が世界で唯一であることを数学的に保証する、というものなのだ。
ハッシュは、乱数(ランダムな、バラバラな数字)に見えて、実はインプットが同じなら出力も常に同じ、という性質を持っている。
ではハッシュは日常生活でどんなところに使われているのだろう?
実はもっといろいろな応用があるが、ちょっと難しかったと思うので今回はここまで。