UnixNano与服务器ID连接是一个很好的主键吗?

时间:2017-03-03 04:19:09

标签: database go primary-key-design

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

  • 词典正确
  • 唯一
  • 尽可能短
  • 按创作时间排序

1 个答案:

答案 0 :(得分:1)

您没有指定要使用的数据库,但我认为它是MySQL。我认为目前最好的唯一ID是UUID,并且MySQL提供将其用作主键。

<form>
  <fieldset id="F1">
    <textarea id="T1" rows="5" cols="50" readonly required></textarea>
    <textarea id="T2" rows="5" cols="50" readonly required></textarea>
    <textarea id="T3" rows="5" cols="50" readonly required></textarea>
  </fieldset>
  <button type="button" id="button" data-affects="#F1"></button>
</form>

在每种情况下都提供唯一的ID。

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