zoukankan      html  css  js  c++  java
  • go 生成雪花id

    package lib
    
    import (
        "sync"
        "time"
    )
    
    type AlgorithmSnowFlake struct {
        sync.Mutex
        machineId     int64
        dataCenterId  int64
        lastTimeStamp int64
        sn            int64
    }
    
    var algorithmSnowFlake *AlgorithmSnowFlake = nil
    
    func GetAlgorithmSnowFlake() *AlgorithmSnowFlake {
        return algorithmSnowFlake
    }
    
    func (sf *AlgorithmSnowFlake) GetID() uint64 {
        sf.Lock()
        defer sf.Unlock()
        
        curTimeStamp := time.Now().UnixNano() / 1000000   // 13位
    
        if curTimeStamp == sf.lastTimeStamp {
            if sf.sn > 4095 {
                time.Sleep(time.Millisecond)
                curTimeStamp = time.Now().UnixNano() / 1000000
                sf.sn = 0
            }
        } else {
            sf.sn = 0
        }
        sf.sn++
        sf.lastTimeStamp = curTimeStamp
    
        // 时间戳向左移动22位
        curTimeStamp = curTimeStamp << 22   // 35
    
        // 合并机器id
        machineId := sf.machineId << 17     // 18
    
        // 合并数据中心id
        dataCenterId := sf.dataCenterId << 12   // 13
    
        // 通过与运算把各个部位连接在一起
        id := curTimeStamp | machineId | dataCenterId | sf.sn
        //return id
        return uint64(id)
    }
    
    func NewAlgorithmSnowFlake(machineId int64, dataCenterId int64) {
        algorithmSnowFlake = &AlgorithmSnowFlake{
            machineId:    machineId,
            dataCenterId: dataCenterId,
        }
    }

    生成10个雪花id

    package main
    
    import (
        "test/lib"
        "fmt"
    )
    
    func main() {
        lib.NewAlgorithmSnowFlake(1, 1)
        m := map[uint64]int{}
        l := []uint64{}
        for i:=0;i<10;i++{
            newID := lib.GetAlgorithmSnowFlake().GetID()
            m[newID] = i
            l = append(l, newID)
        }
    
        for k, v := range m{
            fmt.Println(k,v)
        }
    }
  • 相关阅读:
    windows下面Nginx日志切割
    C#通过DocX创建word
    leetcode 189 Rotate Array
    leetcode 172 Factorial Trailing Zeroes
    leetcode 169 Majority Element 冰山查询
    leetcode 165 Compare Version Numbers
    leetcode 160 Intersection of Two Linked Lists
    【windows-》linux】SCP
    【设计】B端和C端区别
    【Flask】部署
  • 原文地址:https://www.cnblogs.com/zhangjian0092/p/12559280.html
Copyright © 2011-2022 走看看