生成timeuuid_golang 生成数字UUID 改进版(保持原有数据时间戳顺序)
问题:Golang 使用UnixNano()作为唯一键id,在高并发环境下出现重复,package mainimport ("fmt""github.com/fwhezfwhez/go-queue""runtime""strconv""sync""time")var mutex sync.Mutexfunc main() {runtime.GOMAXPROCS(runtime.NumCPU())w
问题:Golang 使用UnixNano()作为唯一键id,在高并发环境下出现重复,
package main
import (
"fmt"
"github.com/fwhezfwhez/go-queue"
"runtime"
"strconv"
"sync"
"time"
)
var mutex sync.Mutex
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
wg := sync.WaitGroup{}
var loopCount int = 5000
var queue = Queue.NewEmpty()
for i := 0; i < loopCount; i++ {
wg.Add(1)
go func(in int, q *Queue.Queue) {
tmp := getNum()
q.SafePush(tmp)
fmt.Println("finish " + strconv.Itoa(in) + ",produce:" + strconv.FormatInt(tmp, 10))
wg.Done()
}(i, queue)
}
wg.Wait()
//queue.Print() // 输入所有UUID
if (queue.ValidLength() == loopCount) {
fmt.Println("生成", loopCount, "个UUID数量,没发现重复,继续测试。")
fmt.Println("备注:若运行没有输出,证明是有重复,程序结束。")
}
}
func getNum() int64 {
mutex.Lock()
defer mutex.Unlock()
return time.Now().UnixNano()
}
运行结果,发现重复:

改进版本-1:数字UUID改进版 (unixNano + hashCode(uuid))
package main
import (
"fmt"
"github.com/fwhezfwhez/go-queue"
uuid "github.com/satori/go.uuid"
"hash/crc32"
"runtime"
"strconv"
"sync"
"time"
)
var mutex sync.Mutex
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
wg := sync.WaitGroup{}
var loopCount int = 5000
var queue = Queue.NewEmpty()
for i := 0; i < loopCount; i++ {
wg.Add(1)
go func(in int, q *Queue.Queue) {
tmp := getNum()
q.SafePush(tmp)
fmt.Println("finish " + strconv.Itoa(in) + ",produce:" + tmp)
wg.Done()
}(i, queue)
}
wg.Wait()
//queue.Print() // 输入所有UUID
if (queue.ValidLength() == loopCount) {
fmt.Println("生成", loopCount, "个UUID数量,没发现重复,继续测试。")
fmt.Println("备注:若运行没有输出,证明是有重复,程序结束。")
}
}
//改进方法
func getNum() string {
mutex.Lock()
defer mutex.Unlock()
currentTime := time.Now()
timestamp := currentTime.UnixNano()
uuid,_ := uuid.NewV4()
uuidHash := int(crc32.ChecksumIEEE([]byte(uuid.String())))
if -uuidHash >= 0 {
uuidHash = -uuidHash
}
uuidStr := strconv.FormatInt(timestamp,10)+strconv.Itoa(uuidHash)
return uuidStr
}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)