适用于分布式ID的雪花算法

时间:2023-03-09 13:15:52
适用于分布式ID的雪花算法

基于Java实现的适用于分布式ID的雪花算法工具类,这里存一下日后好找

/**
* 雪花算法生成ID
*/
public class SnowFlakeUtil { private final static long START_STMP = 1543903501000L; private final static long SEQUENCE_BIT = 12; //序列号占用的位数
private final static long MACHINE_BIT = 5; //机器标识占用的位数
private final static long DATACENTER_BIT = 5;//数据中心占用的位数 private final static long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT);
private final static long MACHINE_LEFT = SEQUENCE_BIT;
private final static long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;
private final static long TIMESTMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT; private static long datacenterId; //数据中心
private static long machineId; //机器标识
private static long sequence = 0L; //序列号
private static long lastStmp = -1L;//上一次时间戳 private SnowFlakeUtil() {} // 调用这个静态函数即可
public static synchronized String nextId() {
long currStmp = getNewstmp();
if (currStmp < lastStmp)
throw new RuntimeException("Clock moved backwards. Refusing to generate id");
if (currStmp == lastStmp) {
sequence = (sequence + 1) & MAX_SEQUENCE;
if (sequence == 0L) {
currStmp = getNextMill();
}
} else sequence = 0L;
lastStmp = currStmp;
return ((currStmp - START_STMP) << TIMESTMP_LEFT
| datacenterId << DATACENTER_LEFT
| machineId << MACHINE_LEFT
| sequence) + "";
} private static long getNextMill() {
long mill = getNewstmp();
while (mill <= lastStmp) {
mill = getNewstmp();
}
return mill;
} private static long getNewstmp() {
return System.currentTimeMillis();
} }