java 雪花算法生成 工具类
时间: 2025-02-18 18:34:48 浏览: 60
### Java 实现雪花算法工具类
雪花算法是一种高效的分布式唯一ID生成方案,在Java中可以通过创建一个工具类来实现该功能。下面展示的是一个典型的Snowflake ID生成器的实现方式[^1]。
```java
public class SnowFlake {
// 起始的时间戳
private final static long START_TIMESTAMP = 1288834974657L;
// 每一部分占用的位数
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_DATACENTER_NUM = ~(-1L << DATACENTER_BIT);
private final static long MAX_MACHINE_NUM = ~(-1L << MACHINE_BIT);
private final static long MAX_SEQUENCE = ~(-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 TIMESTAMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT;
private long datacenterId; //数据中心
private long machineId; //机器标识
private long sequence = 0L; //序列号
public SnowFlake(long datacenterId, long machineId) {
if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0) {
throw new IllegalArgumentException("datacenter Id can't be greater than " + MAX_DATACENTER_NUM + " or less than 0");
}
if (machineId > MAX_MACHINE_NUM || machineId < 0) {
throw new IllegalArgumentException("machine Id can't be greater than " + MAX_MACHINE_NUM + " or less than 0");
}
this.datacenterId = datacenterId;
this.machineId = machineId;
}
/**
* 下一ID的方法
*/
public synchronized long nextId() {
long currTimestamp = timeGen();
if (currTimestamp < lastTimestamp) {
try {
throw new Exception("Clock moved backwards. Refusing to generate id");
} catch (Exception e) {
e.printStackTrace();
}
}
if (lastTimestamp == currTimestamp) { // 当前毫秒内,则+1
sequence = (sequence + 1) & MAX_SEQUENCE;
if (sequence == 0) { // 当前毫秒内计数满了,则等待下一秒
currTimestamp = tilNextMillis(lastTimestamp);
}
} else {
sequence = 0L;
}
lastTimestamp = currTimestamp;
return ((currTimestamp - START_TIMESTAMP) << TIMESTAMP_LEFT) | (datacenterId << DATACENTER_LEFT)
| (machineId << MACHINE_LEFT) | sequence;
}
protected long tilNextMillis(final long lastTimestamp) {
long timestamp = timeGen();
while (timestamp <= lastTimestamp) {
timestamp = timeGen();
}
return timestamp;
}
protected long timeGen() {
return System.currentTimeMillis();
}
}
```
为了提高性能并减少资源消耗,建议采用单例模式实例化此类或通过Spring框架进行依赖注入管理,从而避免频繁的新建操作带来的开销[^2]。
阅读全文
相关推荐














