golang 分布式 雪花演算法

2021-09-25 16:21:54 字數 1771 閱讀 5929

演算法包

package helper

import

("errors"

"sync"

"time"

)// 因為snowflake目的是解決分布式下生成唯一id 所以id中是包含集群和節點編號在內的

const

( workerbits uint8=10

// 每台機器(節點)的id位數 10位最大可以有2^10=1024個節點

numberbits uint8=12

// 表示每個集群下的每個節點,1毫秒內可生成的id序號的二進位制位數 即每毫秒可生成 2^12-1=4096個唯一id

// 這裡求最大值使用了位運算,-1 的二進位制表示為 1 的補碼,感興趣的同學可以自己算算試試 -1 ^ (-1 << nodebits) 這裡是不是等於 1023

workermax int64=-

1^(-

1<< workerbits)

// 節點id的最大值,用於防止溢位

numbermax int64=-

1^(-

1<< numberbits)

// 同上,用來表示生成id序號的最大值

timeshift uint8

= workerbits + numberbits // 時間戳向左的偏移量

workershift uint8

= numberbits // 節點id向左的偏移量

// 41位位元組作為時間戳數值的話 大約68年就會用完

// 假如你2023年1月1日開始開發系統 如果不減去2023年1月1日的時間戳 那麼白白浪費40年的時間戳啊!

// 這個一旦定義且開始生成id後千萬不要改了 不然可能會生成相同的id

epoch int64

=1525705533000

// 這個是我在寫epoch這個變數時的時間戳(毫秒)

)// 定義乙個woker工作節點所需要的基本引數

type worker struct

// 例項化乙個工作節點

func

newworker

(workerid int64)(

*worker,

error

)// 生成乙個新節點

return

&worker

,nil

}// 接下來我們開始生成id

// 生成方法一定要掛載在某個woker下,這樣邏輯會比較清晰 指定某個節點生成id

func

(w *worker)

getid()

int64}}

else

// 第一段 now - epoch 為該演算法目前已經奔跑了***毫秒

// 如果在程式跑了一段時間修改了epoch這個值 可能會導致生成相同的id

id :=

int64

((now-epoch)

<(w.workerid << workershift)

|(w.number)

)return id

}

使用

// 生成節點例項

worker, err :=

newworker(1

)if err !=

nil id := worker.

getid

()

SnowFlakeId 分布式雪花id演算法

package com.jn.baseservice.utils import com.jn.baseservice.common.number import lombok.getter import lombok.setter import lombok.extern.log4j.log4j2 i...

分布式全域性ID之雪花演算法

public class idworker if datacenterid maxdatacenterid datacenterid 0 system.out.printf worker starting.timestamp left shift d,datacenter id bits d,wor...

雪花演算法生成分布式ID

package top.sponger.common.util import lombok.data 描述 twitter的分布式自增id雪花演算法snowflake public class snowflake if machineid max machine num machineid 0 th...