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