美文网首页
go雪花算法

go雪花算法

作者: 帶頭二哥 | 来源:发表于2019-12-20 01:47 被阅读0次
package main

import (
    "errors"
    "fmt"
    "sync"
    "time"
)

const (
    workerBits  uint8 = 10
    numberBits  uint8 = 12
    workerMax   int64 = -1 ^ (-1 << workerBits)
    numberMax   int64 = -1 ^ (-1 << numberBits)
    timeShift   uint8 = workerBits + numberBits
    workerShift uint8 = numberBits
    startTime   int64 = 1525705533000 // 如果在程序跑了一段时间修改了epoch这个值 可能会导致生成相同的ID
)

type Worker struct {
    mu        sync.Mutex
    timestamp int64
    workerId  int64
    number    int64
}

func NewWorker(workerId int64) (*Worker, error) {
    if workerId < 0 || workerId > workerMax {
        return nil, errors.New("Worker ID excess of quantity")
    }
    // 生成一个新节点
    return &Worker{
        timestamp: 0,
        workerId:  workerId,
        number:    0,
    }, nil
}

func (w *Worker) GetId() int64 {
    w.mu.Lock()
    defer w.mu.Unlock()
    now := time.Now().UnixNano() / 1e6
    if w.timestamp == now {
        w.number++
        if w.number > numberMax {
            for now <= w.timestamp {
                now = time.Now().UnixNano() / 1e6
            }
        }
    } else {
        w.number = 0
        w.timestamp = now
    }
    ID := int64((now-startTime)<<timeShift | (w.workerId << workerShift) | (w.number))
    return ID
}
func main() {
    // 生成节点实例
    node, err := NewWorker(1)
    if err != nil {
        panic(err)
    }
    for {
        fmt.Println(node.GetId())
    }
}

相关文章

  • go雪花算法

  • Golang快速排序(分治-填充)

    go快速排序算法,Go没有while循环,使用for 测试

  • 雪花算法

    public class IdSnowCreate { }

  • 雪花算法

  • 雪花算法

    世界上没有两片一样的雪花.雪花算法不会生成一样的的ID 基本原理: 采用的是时间戳+机器号+没毫秒生成的序列号 第...

  • 雪花算法

    雪花算法的原理和实现Java_雨夜青草的博客-CSDN博客_雪花算法 64 = 1 41 10 12

  • 雪花算法

    雪花算法-snowflake 背景: 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以...

  • 雪花算法

    SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit...

  • 雪花算法(07)雪花算法最终版

    雪花算法初步完成后,我们讨论了几个位运算的写法,大家知道雪花算法一旦确定后,很多数字都是定死的,比如机器占多少位,...

  • snowflake雪花算法

    分布式系统中,一些业务场景需要获取全局唯一ID,常用方法为:twitter的snowflake、UUID/GUID...

网友评论

      本文标题:go雪花算法

      本文链接:https://www.haomeiwen.com/subject/cbcbnctx.html