首頁 >後端開發 >Golang >實例詳解如何使用snowflake演算法產生唯一id

實例詳解如何使用snowflake演算法產生唯一id

轉載
2023-04-19 15:46:28668瀏覽

Go 語言中,可以使用 snowflake 演算法產生唯一 id。 Snowflake 演算法是 Twitter 公司開源的分散式 ID 產生演算法,它可以在分散式系統中產生唯一的 ID,保證 ID 的全域唯一性,而且產生的 ID 是按照時間遞增的。

以下是使用Go 語言實作Snowflake 演算法產生唯一id 的範例程式碼,線上執行:

package main
import (
    "fmt"
    "time"
)
const (
    workerBits uint8 = 10
    seqBits    uint8 = 12
    maxWorkerNum int64 = -1 ^ (-1 << workerBits)
    maxSeqNum    int64 = -1 ^ (-1 << seqBits)
    timeShift   uint8 = workerBits + seqBits
    workerShift uint8 = seqBits
)
type snowflake struct {
    lastTimestamp int64
    workerId      int64
    sequence      int64
}
func newSnowflake(workerId int64) *snowflake {
    if workerId < 0 || workerId > maxWorkerNum {
        panic("workerId out of range")
    }
    return &snowflake{
        lastTimestamp: 0,
        workerId:      workerId,
        sequence:      0,
    }
}
func (sf *snowflake) NextId() int64 {
    timestamp := time.Now().UnixNano() / 1000000
    if timestamp < sf.lastTimestamp {
        panic("clock is moving backwards")
    }
    if timestamp == sf.lastTimestamp {
        sf.sequence = (sf.sequence + 1) & maxSeqNum
        if sf.sequence == 0 {
            for timestamp <= sf.lastTimestamp {
                timestamp = time.Now().UnixNano() / 1000000
            }
        }
    } else {
        sf.sequence = 0
    }
    sf.lastTimestamp = timestamp
    return (timestamp << timeShift) | (sf.workerId << workerShift) | sf.sequence
}
func main() {
    sf := newSnowflake(1)
    fmt.Println(sf.NextId())
}

在上述程式碼中,我們定義了一個snowflake 結構體,其中包含了上一次生成的時間戳記、workerId 和sequence 三個屬性。在 newSnowflake 函數中,我們檢查傳入的 workerId 是否在合理範圍內,然後初始化 snowflake 結構體的屬性。在 NextId 函數中,我們首先取得當前時間戳,如果當前時間戳小於上一次產生的時間戳,表示時鐘發生了回撥,此時需要拋出異常。

如果目前時間戳等於上次產生的時間戳,表示在同一毫秒內產生了多個 ID,此時需要自增 sequence,如果 sequence 達到了最大值,則需要等到下一個毫秒。如果目前時間戳大於上一次產生的時間戳,表示進入了下一個毫秒,此時需要將 sequence 重設為 0,並更新 lastTimestamp。最後,根據時間戳記、workerId 和 sequence 產生唯一的 ID。

在這個範例中,我們設定 workerId=1 產生了一個唯一的 ID,你可以根據實際情況來使用不同的 workerId。

推薦學習:《go影片教學

以上是實例詳解如何使用snowflake演算法產生唯一id的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除