雪花算法,用来生成唯一主键.
简单来说
1bit不用 始终为零 表示id始终为正数;
41bit时间戳,一般是用当前时间毫秒数减去项目开始时间毫秒数,可以用69年.
10bit工作机器id 表示程序可以部署在2的10次方 1024个节点
12bit序列号,用来应对高并发时在同一毫秒内生成的id,使其得到区分.
整体思路为:
1,检查各部分是否符合要求
2,获取时间戳数值
(1)如果当前时间戳如果小于上次时间戳,则表示时间戳获取出现异常
(2)获取当前时间戳如果等于上次时间戳(同一毫秒内),则在序列号加一;否则序列号赋值为0,从0开始。
(3) 将上次时间戳值刷新
3 用位运算拼接结果.
代码如下:
public class IdWorker{
//下面两个每个5位,加起来就是10位的工作机器id
private long workerId; //工作id
private long datacenterId; //数据id
//12位的序列号
private long sequence;
public IdWorker(long workerId, long datacenterId, long sequence){
// sanity check for workerId
if (workerId > maxWorkerId || workerId < 0) {
throw new IllegalArgumentException(String.format("worker Id can't be grea