2
私はGoのUnixNanoから10kの整数を生成しようとしましたが、衝突は見られません。UnixNanoはサーバーIDと連結されていますか?
package main
import (
"fmt"
"sync"
"time"
"strconv"
"github.com/OneOfOne/cmap"
)
func main() {
var wg sync.WaitGroup
k := 1000
wg.Add(k * 1000)
coll := cmap.New()
for z := 0; z < k*1000; z++ {
go func() {
k := strconv.FormatInt(time.Now().UnixNano(),36)
if coll.Has(k) {
fmt.Println(`collision: `, k)
}
coll.Set(k,true)
defer wg.Done()
}()
}
wg.Wait()
}
データベースは最大64ビット整数のみをサポートし、アトミックカウンタ/シリアルはサポートしていません。
EDIT 2017年3月6日それは何の可能性がないであろう3桁のサーバキーを付加し、私はその番号を使用して主キーを作成する場合、BASE-36をするように変換だから、衝突
collision: bb70elvagvqu
collision: bb70elwbgk98
collision: bb70elwnxcm7
を持っています衝突の権利?
いくつかの例:2017年3月4日
- 辞書的に正しい
0bb4snonc8nfc001 (current time, 1st server) 1y2p0ij32e8e7zzz (maximum value: 2262-04-11 23:47:16.854775807, 46654th/last server)
要件
- ユニーク
- は、作成時間順のオーダー可能な限り短く
うるう秒、または単にntpによってコンピュータクロックが調整されたらどうなりますか? – ymonad
あなた自身を動かす代わりにUUIDを使用できますか? http://stackoverflow.com/questions/15130321/is-there-a-method-to-generate-a-uuid-with-go-language – stderr
これは私に半分実装された雪片のアイデアのようです。 https://github.com/bwmarrin/snowflakeをご覧ください。 – tsdtsdtsd