UUID の重複する可能性

UUID Wikipedia 日本語版によると

UUIDは、分散システム上でどこかが統制を取らずとも、一意に特定可能な識別子の作成を目的としており、UUIDは重複や偶然の一致が起こりえないと確信して用いることができる。

UUID - Wikipedia

という。しかしながら、高々 122 ビットで表される数値*1である以上、生成し続ければ確実に重複する。

では、それがどれぐらいの確率なのか。

その説明は UUID Wikipedia 英語版に記載されている。英語だったり数式があったりしてわかりづらいが、説明の一部を訳してみたので、重複しない感が多少は分かるかと思う。

例 1
  • 1 兆個 UUID を生成
  • 生成した UUID が重複する確率より、隕石が頭に降ってくる確率のほうが高い
例 2
  • 100 年間、毎秒 10 億の UUID を生成し続ける
  • その後、UUID をひとつ生成
  • 生成した UUID が過去のものと一致する確率は約 50%
例 3*2
  • 地球上のすべての人に 6 億ずつ UUID を配布
  • その後、UUID をひとつ生成
  • 生成した UUID が誰かのものと一致する確率は約 50%


要するにだ、420000 京の UUID があって、ようやく重複率が 50% だということはだ、重複を考慮しなくても良いということで、重複した場合の心配をするぐらいなら、別のテストケースを追加しなよ、ということだ。


ちなみに僕は、C ヘッダのインクルードガードに UUID を使っている。よくある #ifndef HOGE_H__ とかだと偶然重複しそうじゃない?

*1:5316911983139663491615228241121378304

*2:なんか、例 2 と例 3 が同じ確率というのがびっくり。感覚的に 100 年間の UUID の生成数の方が圧倒的に多いように思えるんだけど・・・、計算してみたら実は逆だったというのにびっくりした。例 2: 3153600000000000000 個 = 60 × 60 × 24 × 365 × 100 × 1000000000、例 3: 4200000000000000000 個 = 600000000 個 × 7000000000 億人