みなさんユニークな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で再度検証してみます.