2017-03-03 4 views
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) 
    

    要件

  • ユニーク
  • は、作成時間順のオーダー可能な限り短く
+0

うるう秒、または単にntpによってコンピュータクロックが調整されたらどうなりますか? – ymonad

+1

あなた自身を動かす代わりにUUIDを使用できますか? http://stackoverflow.com/questions/15130321/is-there-a-method-to-generate-a-uuid-with-go-language – stderr

+1

これは私に半分実装された雪片のアイデアのようです。 https://github.com/bwmarrin/snowflakeをご覧ください。 – tsdtsdtsd

答えて

1

あなたは使用したいデータベースを指定していませんでしたが、MySQLと思われます。私が考える最もユニークなIDはUUIDで、MySQLはこれをプライマリキーとして使用します。

create table users(id varchar(36), name varchar(200)); 
insert into users values(uuid(), 'Andromeda'); 

すべてのケースで一意のIDを提供します。

ゴランとそれをサポートしているデータベースのいずれかであるので、もちろん他のすべてのデータベースでも使用できます。 GolangのGithubには、多くのUUIDジェネレータがあります。

関連する問題