2014年4月19日土曜日

2 の 256 乗を計算してみた

2256 を十進数で表すと 78 桁で、無量大数の十億倍くらいの値であることが分かりました。 ちゃんとした方法でランダムに生成した 256 ビットのハッシュ値が偶然ぶつかるかもしれないなんてことを心配するのは馬鹿げていることを理解しました。いや、馬鹿げているのは理解していたのですけど、実際に計算してみると、どれだけ途方もなく馬鹿げているのかが分かった、という話です。

どれくらい大きな数字なのか例えで考えてみます。
  1. 太陽の寿命が来るまで今から 50 億年のあいだ、
  2. 100 億人の人が、
  3. 毎ナノ秒 1 兆個の数値を消費していく活動があり、
  4. その活動を、太陽系が属するこの銀河系の全ての星(~2,000 億くらい)でおこなうと、
消費される数字の個数は、50 億年 × 100 億人 × 100000000 ナノ秒 × 60 秒 × 60 分 × 24 時間 × 365 日 × 1 兆個 × 2000 億個(星) で 59 桁の数字になります。こんなに頑張って消費しても、50 億年後 (太陽が赤色巨星になって太陽系が崩壊する頃) に消費し終わっているのは、(59 桁) / (78 桁) = 10-19、つまり全体の 100 京分の 1 です。

ちなみに、Java の long は 64 ビットで 10 進数だと 20 桁 (2000 京弱)。10 億人が毎秒消費なら1000 年くらいで使い切る計算。秒間 10 億を千年。それを超えるような想定をしなければならないシステムを作ることはないでしょうね。推測可能でよい ID なら、long で連番振っておけば十分でしょうね。


21 = 2
22 = 4
23 = 8
24 = 16
25 = 32
26 = 64
27 = 128
28 = 256
29 = 512
210 = 1,024
211 = 2,048
212 = 4,096
213 = 8,192
214 = 16,384
215 = 32,768
216 = 65,536
217 = 131,072
218 = 262,144
219 = 524,288
220 = 1,048,576 (7 桁)
= 104 万 8576
221 = 2,097,152 (7 桁)
= 209 万 7152
222 = 4,194,304 (7 桁)
= 419 万 4304
223 = 8,388,608 (7 桁)
= 838 万 8608
224 = 16,777,216 (8 桁)
= 1677 万 7216
225 = 33,554,432 (8 桁)
= 3355 万 4432
226 = 67,108,864 (8 桁)
= 6710 万 8864
227 = 134,217,728 (9 桁)
= 1 億 3421 万 7728
228 = 268,435,456 (9 桁)
= 2 億 6843 万 5456
229 = 536,870,912 (9 桁)
= 5 億 3687 万 912
230 = 1,073,741,824 (10 桁)
= 10 億 7374 万 1824
231 = 2,147,483,648 (10 桁)
= 21 億 4748 万 3648
232 = 4,294,967,296 (10 桁)
= 42 億 9496 万 7296
248 = 4,281,474,976,710,656 (16 桁)
= 4281 兆 4749 億 7671 万 656
264 = 18,446,744,073,709,551,616 (20 桁)
= 1844 京 6744 兆 737 億 955 万 1616
2128 = 340,282,366,920,938,463,463,374,607,431,768,211,456 (39 桁)
= 340 澗 2823 溝 6692 穣 938 じょ 4634 垓
6337 京 4607 兆 4317 億 6821 万 1456
2256 = 115,792,089,237,316,195,423,570,985,008,687,907,853,
269,984,665,640,564,039,457,584,007,913,129,639,936 (78 桁)
= 1157920892 無量大数
3731 不可思議 6195 那由他 4235 阿僧祇
7098 恒河沙 5008 極 6879 載 785 正
3269 澗 9846 溝 6564 穣 564 じょ 394 垓
5758 京 4007 兆 9131 億 2963 万 9936

Blogger の都合でサロゲートペアの文字が化けるため、平仮名で表記。 Blogger もうやだ・・・。