Golang生成唯一消息ID

发布时间: 2020-11-15 更新时间: 2021-12-01

Golang Golang,消息ID 1.40 K 1 分钟 480

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")
end
如果你觉得还不错的话,请我吃个午饭吧!😍
支付宝
支付宝
微信
微信
目录

Copyright © 2019-2020 qzq版权所有

蜀ICP备19012274号-1 | 管理