package com.fastbee.common.utils.uuid; import lombok.extern.slf4j.Slf4j; import com.fastbee.common.utils.Md5Utils; import java.util.Random; /** * ID生成器工具类 * * @author ruoyi */ @Slf4j public class IdUtils { private static long lastTimestamp = -1L; private long sequence = 0L; private final long workerId; private final long datacenterId; private static Integer startIndex=0; private static Integer endIndex=6; public IdUtils(long workerId, long datacenterId) { if(workerId <= 31L && workerId >= 0L) { this.workerId = workerId; } else { if(workerId != -1L) { throw new IllegalArgumentException("worker Id can't be greater than %d or less than 0"); } this.workerId = (long)(new Random()).nextInt(31); } if(datacenterId <= 31L && datacenterId >= 0L) { this.datacenterId = datacenterId; } else { if(datacenterId != -1L) { throw new IllegalArgumentException("datacenter Id can't be greater than %d or less than 0"); } this.datacenterId = (long)(new Random()).nextInt(31); } } public synchronized long nextId() { long timestamp = this.timeGen(); if(timestamp < lastTimestamp) { try { throw new Exception("Clock moved backwards. Refusing to generate id for " + (lastTimestamp - timestamp) + " milliseconds"); } catch (Exception e) { log.warn("生成ID异常", e); } } if(lastTimestamp == timestamp) { this.sequence = this.sequence + 1L & 4095L; if(this.sequence == 0L) { timestamp = this.tilNextMillis(lastTimestamp); } } else { this.sequence = 0L; } lastTimestamp = timestamp; return timestamp - 1288834974657L << 22 | this.datacenterId << 17 | this.workerId << 12 | this.sequence; } private long tilNextMillis(long lastTimestamp) { long timestamp; for(timestamp = this.timeGen(); timestamp <= lastTimestamp; timestamp = this.timeGen()) { ; } return timestamp; } private long timeGen() { return System.currentTimeMillis(); } public static String uuid() { return java.util.UUID.randomUUID().toString().replaceAll("-", ""); } public static String getNextCode() { return Md5Utils.md5(IdUtils.uuid() + System.currentTimeMillis()).substring(startIndex,endIndex); } /** * 获取随机UUID * * @return 随机UUID */ public static String randomUUID() { return UUID.randomUUID().toString(); } /** * 简化的UUID,去掉了横线 * * @return 简化的UUID,去掉了横线 */ public static String simpleUUID() { return UUID.randomUUID().toString(true); } /** * 获取随机UUID,使用性能更好的ThreadLocalRandom生成UUID * * @return 随机UUID */ public static String fastUUID() { return UUID.fastUUID().toString(); } /** * 简化的UUID,去掉了横线,使用性能更好的ThreadLocalRandom生成UUID * * @return 简化的UUID,去掉了横线 */ public static String fastSimpleUUID() { return UUID.fastUUID().toString(true); } }