golang雪花算法實現(xiàn)64位的ID的示例代碼
更新時間:2024年09月29日 08:36:05 作者:GoppViper
本文展示了使用Go語言實現(xiàn)雪花算法生成64位ID的示例代碼,雪花算法通過當前時間戳、工作節(jié)點ID、數據中心ID和序列號生成唯一的64位ID,確保在分布式系統(tǒng)中的唯一性和時間順序性,感興趣的可以了解一下
以下是使用 Go 語言實現(xiàn)雪花算法生成 64 位 ID 的示例代碼:
package main import ( "fmt" "sync" "time" ) const ( // 起始時間戳(2020-01-01) twepoch = 1577836800000 workerIDBits = 5 datacenterIDBits = 5 sequenceBits = 12 maxWorkerID = -1 ^ (-1 << workerIDBits) maxDatacenterID = -1 ^ (-1 << datacenterIDBits) maxSequence = -1 ^ (-1 << sequenceBits) workerIDShift = sequenceBits datacenterIDShift = sequenceBits + workerIDBits timestampLeftShift = sequenceBits + workerIDBits + datacenterIDBits ) type Snowflake struct { mu sync.Mutex lastTimestamp int64 workerID int64 datacenterID int64 sequence int64 } func NewSnowflake(workerID, datacenterID int64) (*Snowflake, error) { if workerID < 0 || workerID > maxWorkerID { return nil, fmt.Errorf("worker ID must be between 0 and %d", maxWorkerID) } if datacenterID < 0 || datacenterID > maxDatacenterID { return nil, fmt.Errorf("datacenter ID must be between 0 and %d", maxDatacenterID) } return &Snowflake{ workerID: workerID, datacenterID: datacenterID, lastTimestamp: -1, sequence: 0, }, nil } func (s *Snowflake) NextID() int64 { s.mu.Lock() defer s.mu.Unlock() timestamp := time.Now().UnixNano() / 1e6 if timestamp < s.lastTimestamp { return 0 } if s.lastTimestamp == timestamp { s.sequence = (s.sequence + 1) & maxSequence if s.sequence == 0 { for timestamp <= s.lastTimestamp { timestamp = time.Now().UnixNano() / 1e6 } } } else { s.sequence = 0 } s.lastTimestamp = timestamp return ((timestamp - twepoch) << timestampLeftShift) | (s.datacenterID << datacenterIDShift) | (s.workerID << workerIDShift) | s.sequence }
你可以使用以下方式調用:
func main() { sf, err := NewSnowflake(1, 1) if err!= nil { panic(err) } id := sf.NextID() fmt.Println(id) }
這個實現(xiàn)創(chuàng)建了一個雪花算法的結構體Snowflake,通過互斥鎖保證并發(fā)安全。它根據當前時間戳、工作節(jié)點 ID、數據中心 ID 和序列號生成唯一的 64 位 ID。生成的 ID 是一個遞增的數字,具有時間順序性,并且在分布式系統(tǒng)中可以保證唯一性。
到此這篇關于golang雪花算法實現(xiàn)64位的ID的示例代碼的文章就介紹到這了,更多相關golang 64位的ID內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:
相關文章
Go使用TimerController解決timer過多的問題
多路復用,實際上Go底層也是一種多路復用的思想去實現(xiàn)的timer,但是它是底層的timer,我們需要解決的問題就過多的timer問題!本文給大家介紹了Go使用TimerController解決timer過多的問題,需要的朋友可以參考下2024-12-12linux下通過go語言獲得系統(tǒng)進程cpu使用情況的方法
這篇文章主要介紹了linux下通過go語言獲得系統(tǒng)進程cpu使用情況的方法,實例分析了Go語言使用linux的系統(tǒng)命令ps來分析cpu使用情況的技巧,需要的朋友可以參考下2015-03-03