银川网站网站建设,橘子皮主题wordpress,四平网站建设公司,长安网站建设制作公司其实雪花算法比较简单#xff0c;可能称不上什么算法就是一种构造UID的方法。 点1#xff1a;UID是一个long类型的41位时间戳#xff0c;10位存储机器码#xff0c;12位存储序列号。 点2#xff1a;时间戳的单位是毫秒#xff0c;可以同时链接1024台机器#xff0c;每台…其实雪花算法比较简单可能称不上什么算法就是一种构造UID的方法。 点1UID是一个long类型的41位时间戳10位存储机器码12位存储序列号。 点2时间戳的单位是毫秒可以同时链接1024台机器每台机器每毫秒可以使用4096个序列好我们会给生成id上一个同步锁阻塞住其他线程的访问。 点3利用掩码我们可以检测序列是否溢出如果溢出的话就强制等待到下一毫秒。 /*** author hardstone* since 29 July 2023(1690603385473)*/
public class SnowFlakes {//开始的时间戳private final long start 1690603385473L;//机器标识长度5位private final long machineIdBits 5L;//机器集群标识长度5位private final long centerIdBits 5L;//序列标识所占位数12位private final long sequenceBits 12L;//机器标识最大值private final long maxMachineId -1L ^ (-1L machineIdBits);//机器集群标识最大值private final long maxCenterId -1L ^ (-1L centerIdBits);//序列标识的最大值private final long sequenceMask -1L ^ (-1L sequenceBits);//机器标识左移长度private final long machineIdShift sequenceBits;//机器集群标识左移长度private final long centerIdShift sequenceBits machineIdBits;//时间戳左移长度private final long timeStampIdShift sequenceBits machineIdBits centerIdBits;//序列Idprivate long sequence 0L;//机器Idprivate long machineId;//机器集群Idprivate long centerId;//时间戳private long lastTimeStamp -1L;public SnowFlakes(long machineId, long centerId) {if (machineId maxMachineId || machineId 0) {throw new IllegalArgumentException(String.format(WorkerId should be between 0 and 31));}if (centerId maxCenterId || centerId 0) {throw new IllegalArgumentException(String.format(CenterId should be between 0 and 31));}}public synchronized long nextId() {long timeStamp System.currentTimeMillis();//时间回滚现象if (timeStamp lastTimeStamp) {throw new RuntimeException(String.format(Time gone backwards!));}if (lastTimeStamp timeStamp) {sequence (sequence 1) sequenceMask;//如果序列分配完了if (sequence 0) {timeStamp getNextMillis(lastTimeStamp);}} else {sequence 0L;}lastTimeStamp timeStamp;return ((timeStamp - start) timeStampIdShift)| (centerId centerIdShift)| (machineId machineIdShift)| sequence;}protected long getNextMillis(long lastTimeStamp) {long timeStamp System.currentTimeMillis();while (timeStamp lastTimeStamp) {timeStamp System.currentTimeMillis();}return timeStamp;}public static void main(String[] args) {System.out.println(new SnowFlakes(0, 0).nextId());}
}