直感的な確率と理論値の差について

もう一つ例をあげましょう。ここに 2つのファイルがあるとして、中身が同一であるかチェックしたいとします。ファイルはギガバイト単位の大きさで、しかもランダムアクセスのできないテープ上にあり、ローカルメモリもほとんどないとします。しかし、計算機の速度は十分に高速であるとしましょう。
この場合、テープを何度もシーク(?)しながらファイルを比較するよりも、2つのファイルのセキュアハッシュ値を比較するほうが容易です。厳密には、純粋数学的には、複数の異なるファイルが同一のハッシュ値を持ちうることは平凡な事実ですが、現実的には、人間が一生の間に出会う無作為なデータ列が同一のセキュアハッシュ値をもたらす可能性*1はゼロに極めて近いです*2
例えば、ここでセキュアハッシュ関数が 160 ビットの情報を出力するとしましょう。1秒に 1回、上記のようなファイル比較法を取ったとして、たまたま異なるファイルが同一であると誤認されるまでの平均時間は、2.3\times10^{40} 年にもなります!! 宇宙の年齢を 137億年と見積もった場合、この時間に対しても 1.7\times10^{30} 倍にもなります。いかに大きな数字が分かるでしょう。
しかし人間の直感的には、この 2つのファイルの比較があなたのクビを左右するような場合であれば、きちんとファイルの比較をするソフトを書くことでしょう。上司だって上記の方法だと、きっと不安を感じるはずです。でも、あなたがファイルの比較をまじめに実現するコードを書いたとして、それにバグが混入し、それがテストをしても見つからない確率は、相対的に天文学的に大きな値になるでしょう。それに、テープ上のデータのビット誤りは、せいぜい 32 bit CRC くらいで保護されているのですが、160 ビットのセキュアハッシュに比べて極めて小さな値です。ビット誤りを常にランダム誤りと強引に仮定した場合、セキュアハッシュがコリジョンする確率より、ビット誤りを見逃す確率のほうが高いと言えます。
これが、直感的な確率が当てにならない一つの例です。

*1:コリジョンと呼びます。既に、MD5 などのセキュアハッシュは、作為的にコリジョンを起こさせ得ることが分かっています。

*2:セキュアハッシュ値が十分に長く、写像が十分に散らばっているという条件付きですが。