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 位整数,不支持原子计数器/序列。

编辑 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 和支持它的数据库也是如此。您可以在 Github for Golang 上找到许多 UUID 生成器。

于 2017-03-03T14:35:43.450 回答