Edited at

Golangを使って可能な限りUniqueなIDを生成する

More than 3 years have passed since last update.


背景

最近複数台の環境間でログに出力するUniqueIDだったり、色々コードを考えることがあったので、メモがてら書き出しました。


弊社のセキュリティのスペシャリストだったり、色々な人に知恵を頂いた結果でもありますが!


参考にする知識

誕生日のパラドクス

誕生日攻撃

色々あとで書く

考え方

同一マイクロ秒時に15000件作成した際の衝突確率を0.00098以下にする。


必要バイト数算出方法


回数

2^n n=14

16384

計算式の関係上わかりやすく、n=14として想定数より多めに計算


衝突確率

1/(2^m) m=10

0.00098


同タイミングに上記回数で上記衝突確率に抑えることができるbit数

2*(n+m)

48bit = 6byte

更に、1.5倍ほどしておく

※時間が見つけて理由を追記します。

その結果、10バイトの文字列が必要になります。


結果みせなさいよ

16進数 version

http://play.golang.org/p/M63fCAbbgG

全体で60文字になります。ちょっとおおいなー。

base64 version

http://play.golang.org/p/N6FhPJTBUq

全体で40文字になります。まあいい感じ


ちなみに

githubのcommit idは

fc23e32a331a684831d08df7677c2deb438084cc

と、40文字でした。

16進数で40文字程度ですので、この記事の計算はやり過ぎ感ありますね笑


総括

コード設計は奥が深いです。


今回bitだったり、文字コードだったり、数学的知識だったり


色々不勉強だなーと実感した次第です。