LoginSignup
5
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-04-07

背景

最近複数台の環境間でログに出力する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だったり、文字コードだったり、数学的知識だったり

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

5
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5