|
|
- package helper
-
- import (
- "sync"
- "time"
- )
-
- // Snowflake 结构体
- type Snowflake struct {
- mu sync.Mutex
- startTime int64 // 起始时间戳,可以根据实际需求设置
- machineID int64 // 机器ID
- sequenceNum int64 // 序列号
- }
-
- // NewSnowflake 创建一个Snowflake实例
- func NewSnowflake(machineID int64) *Snowflake {
- return &Snowflake{
- startTime: getTimeStamp(),
- machineID: machineID,
- sequenceNum: 0,
- }
- }
-
- // Generate 生成一个唯一ID
- func (s *Snowflake) Generate() int64 {
- s.mu.Lock()
- defer s.mu.Unlock()
-
- currentTime := getTimeStamp()
-
- // 如果当前时间小于上一次生成ID的时间,说明时钟回拨,需要等待
- if currentTime < s.startTime {
- time.Sleep(time.Duration(s.startTime - currentTime))
- currentTime = getTimeStamp()
- }
-
- // 如果是同一毫秒内生成的ID,需要增加序列号
- if currentTime == s.startTime {
- s.sequenceNum++
- } else {
- s.sequenceNum = 0
- s.startTime = currentTime
- }
-
- // 如果序列号超过了12位的最大值,等待下一毫秒再生成ID
- if s.sequenceNum >= 1<<12 {
- time.Sleep(time.Millisecond)
- s.startTime = getTimeStamp()
- s.sequenceNum = 0
- }
-
- // 生成ID
- id := (currentTime-s.startTime)<<22 | (s.machineID << 12) | s.sequenceNum
-
- return id
- }
-
- // 获取当前时间戳(毫秒级)
- func getTimeStamp() int64 {
- return time.Now().UnixNano() / int64(time.Millisecond)
- }
|