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) }