将与服务器ID串联的Unixnano是一个很好的主键



我试图从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 IT Collision

collision:  bb70elvagvqu
collision:  bb70elwbgk98
collision:  bb70elwnxcm7

因此,如果我使用该数字创建一个主键,则转换为基本36,附加了3位数字服务器键,是否可能碰撞对吗?

一些示例:

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

要求2017-03-04

  • 词典正确
  • 唯一
  • 尽可能短
  • 由创建时间订购

您没有指定要使用的数据库,但我想是mySQL。我认为目前最好的ID是UUID,而MySQL则将其用作主要键。

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

在每种情况下,它都提供了一个唯一的ID。

当然,您可以在其他所有数据库中使用它,因为Golang和数据库支持它。您可以在Github上找到许多UUID发电机的Golang。

相关内容

  • 没有找到相关文章

最新更新