欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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語言的panic和recover函數用法實例

    go語言的panic和recover函數用法實例

    今天小編就為大家分享一篇關于go語言的panic和recover函數用法實例,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • Go語言中init函數與匿名函數使用淺析

    Go語言中init函數與匿名函數使用淺析

    這篇文章主要介紹了Go語言中init函數與匿名函數使用淺析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-01-01
  • Go使用TimerController解決timer過多的問題

    Go使用TimerController解決timer過多的問題

    多路復用,實際上Go底層也是一種多路復用的思想去實現(xiàn)的timer,但是它是底層的timer,我們需要解決的問題就過多的timer問題!本文給大家介紹了Go使用TimerController解決timer過多的問題,需要的朋友可以參考下
    2024-12-12
  • GO如何模擬流操作實現(xiàn)示例探究

    GO如何模擬流操作實現(xiàn)示例探究

    這篇文章主要為大家介紹了GO如何模擬流操作實現(xiàn)示例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • 解決go在函數退出后子協(xié)程的退出問題

    解決go在函數退出后子協(xié)程的退出問題

    這篇文章主要介紹了解決go在函數退出后子協(xié)程的退出問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • golang分層測試之http接口測試入門教程

    golang分層測試之http接口測試入門教程

    這篇文章主要介紹了golang分層測試之http接口測試入門教程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • linux下通過go語言獲得系統(tǒng)進程cpu使用情況的方法

    linux下通過go語言獲得系統(tǒng)進程cpu使用情況的方法

    這篇文章主要介紹了linux下通過go語言獲得系統(tǒng)進程cpu使用情況的方法,實例分析了Go語言使用linux的系統(tǒng)命令ps來分析cpu使用情況的技巧,需要的朋友可以參考下
    2015-03-03
  • Go語言七篇入門教程五文件及包

    Go語言七篇入門教程五文件及包

    本章節(jié)主要介紹go語言的文件處理與包管理,本文是Go語言七篇入門教程系列篇,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11
  • go語言map與string的相互轉換的實現(xiàn)

    go語言map與string的相互轉換的實現(xiàn)

    這篇文章主要介紹了go語言map與string的相互轉換的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • 一文詳解go中如何實現(xiàn)定時任務

    一文詳解go中如何實現(xiàn)定時任務

    定時任務是指按照預定的時間間隔或特定時間點自動執(zhí)行的計劃任務或操作,這篇文章主要為大家詳細介紹了go中是如何實現(xiàn)定時任務的,感興趣的可以了解下
    2023-11-11

最新評論