適用於分散式ID的雪花演算法
阿新 • • 發佈:2021-01-11
基於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(); } }