2

Go の UnixNano から 10k の整数を生成しようとしましたが、衝突は見られません。

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-03-06 衝突があります

collision:  bb70elvagvqu
collision:  bb70elwbgk98
collision:  bb70elwnxcm7

したがって、その番号を使用して主キーを作成し、base-36 に変換し、3 桁のサーバー キーを追加した場合、衝突の可能性はありませんか?

いくつかの例:

  0bb4snonc8nfc001 (current time, 1st server)
  1y2p0ij32e8e7zzz (maximum value: 2262-04-11 23:47:16.854775807, 46654th/last server)

要件 2017-03-04

  • 辞書編集的に正しい
  • 個性的
  • できるだけ短く
  • 作成時間順
4

1 に答える 1

1

使用するデータベースは指定されていませんが、MySQL だと思います。現在私が考える最良の一意の ID はUUIDであり、MySQL はそれを主キーとして使用するために提供しています。

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

あらゆる場合に一意の ID を提供します。

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

于 2017-03-03T14:35:43.450 に答える