うえるかむとぅあんだぁぐらうんど

世の中わからないことだらけだ.少し確かなことは検証をしたことだけ

UUID v4の衝突実験をした話

みなさんユニークなIDを振りたいときどうしていますか?

プライベートでVRに最適化したネットワーク同期エンジンを作っていて,そのエンジンで使うオブジェクトの識別子にUUID v4を検討していました.

しかしながらUUID v4は非常に確率が低いものの衝突する可能性があります.

そのためサーバーのメモリが許す限りのUUIDを生成して衝突するかを実験してみました.

以下のリポジトリに実際の実験に使ったコードをおいておきます.

https://github.com/bootjp/collision_experiment_uuidv4

環境

  • CPU : Xeon E5-2620 2.0GHz * 2
  • MEM : DDR3-ECC 48GB

結果

$ go run run.go > /tmp/uuid.txt &
# OOM Killer が発動するか実行終了まで待つ
$ cat /tmp/uuid.txt | wc -l
436208281
bootjp@server:~$ ls -lah /tmp/uuid.txt
-rw-rw-r-- 1 bootjp bootjp 16G Mar 31 15:17 /tmp/uuid.txt

436,208,281(4億)のUUIDを生成して重複はありませんでした.

4億個ほどのUUIDであれば3回実行しても重複は確認できませんでした.

まとめ

すくなくとも4億程度であれば衝突の可能性は大丈夫そう

Mapを使っているためか,メモリ効率が悪く4億個までしか検証できませんでした.
これは次の課題としてロックをとったSliceで再度検証してみます.