演算法包
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...