Golang生成唯一消息ID
发布时间: 2020-11-15 更新时间: 2023-06-05
Golang Golang,消息ID 1.40 K 1 分钟 1344
Golang生成唯一消息ID
简介
由于最近在做物联网相关的项目,每次给设备发送消息时,需要带上消息ID,而且消息ID尽量是纯数字。网上也有许多生成UUID算法,但是大多都不是纯数字。在某个偏僻的角落发现了一种UUID算法snowflake的实现库。基本上也满足目前的消息ID生成(本身平台的消息ID只用于发送命令,性能要求不是很高)。因此精简了一下代码。改过后一秒内可以生成65535个ID。
代码实现
import (
"sync"
"time"
)
const (
// 最大值
MaxSequence = -1 ^ (-1 << 16)
)
var (
lastTimestamp int64 = 0
sequence int32 = 0
lock = sync.Mutex{}
)
// 生成消息ID
func GenerateMsgId() (int64, int32) {
lock.Lock()
defer lock.Unlock()
ts := timestamp()
if ts == lastTimestamp {
sequence = (sequence + 1) & MaxSequence
if sequence == 0 {
ts = waitNextMilli(ts)
}
} else {
sequence = 0
}
lastTimestamp = ts
return lastTimestamp, sequence
}
func waitNextMilli(ts int64) int64 {
// 暂停一秒
for ts == lastTimestamp {
time.Sleep(1 * time.Second)
ts = timestamp()
}
return ts
}
func timestamp() int64 {
return time.Now().Unix()
}
使用
timestamp, sequence:= GenerateMsgId()
Id :=fmt.Sprintf("%d%d",timestamp, sequence)
fmt.Print(Id, "\n")

