背景
最近複数台の環境間でログに出力する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だったり、文字コードだったり、数学的知識だったり
色々不勉強だなーと実感した次第です。