2017-03-03 2 views
2

Go의 UnixNano에서 10k 정수를 생성하려고 시도했지만 충돌이 표시되지 않습니다.UnixNano가 서버 ID와 연결된 좋은 기본 키입니까?

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년 3월 6일 내가 그 번호를 사용하여 기본 키를 생성하는 경우,베이스 (36)로 변환이 더 가능하지 않을 것이다 3 자리 서버 키 첨부 따라서 충돌을

collision: bb70elvagvqu 
collision: bb70elwbgk98 
collision: bb70elwnxcm7 

을 갖는다 충돌 권리?

일부 예 : 2017년 3월 4일

  • 사 전적으로 정확

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

    요구

  • 고유
  • 는 생성 시간에 의해 정렬 가능한 짧게
  • ,536,
+0

두 번째로 도약을하거나 컴퓨터 시계를 ntp로 조정하면 어떻게됩니까? – ymonad

+1

자신의 롤링 대신 UUID를 사용할 수 있습니까? http://stackoverflow.com/questions/15130321/is-there-a-method-to-generate-a-uuid-with-go-language – stderr

+1

이것은 구현 된 절반의 눈송이 아이디어처럼 보입니다. https://github.com/bwmarrin/snowflake를 확인하십시오. – tsdtsdtsd

답변

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 생성기를 찾을 수 있습니다.