雪花算法16位工具类
时间: 2025-02-10 08:55:53 浏览: 107
### 关于16位雪花算法ID生成器Java工具类
通常情况下,标准的雪花算法使用的是64位二进制表示的时间戳、机器ID以及序列号。然而,在某些特定场景下可能需要更紧凑的ID长度,比如16位。对于这种需求,可以通过调整时间戳精度和其他字段分配来适应较短的位数。
下面是一个简化版的16位雪花算法ID生成器Java工具类示例:
```java
public class TinySnowflakeIdWorker {
private static final int EPOCH_BITS = 7; // 时间戳占用位数
private static final int SEQ_BITS = 9; // 序列号占用位数
private static final long MAX_SEQ_NUM = ~(-1L << SEQ_BITS); // 最大序列号值
private static final long SEQ_MASK = MAX_SEQ_NUM;
private static final long TINY_EPOCH = System.currentTimeMillis() >>> (63 - EPOCH_BITS);
private volatile long lastTimestamp = -1L;
private long sequence = 0;
public synchronized long nextId() {
long timestamp = timeGen();
if (timestamp < lastTimestamp) { // 如果当前时间小于上次记录的时间,则抛出异常
throw new RuntimeException(String.format(
"Clock moved backwards. Refusing to generate id for %d milliseconds",
lastTimestamp - timestamp));
}
if (lastTimestamp == timestamp) { // 同一毫秒内增加序列号
sequence = (sequence + 1) & SEQ_MASK;
if (sequence == 0) { // 当前毫秒内的序列号已满
timestamp = tilNextMillis(lastTimestamp);
}
} else { // 不同毫秒重置序列号为0
sequence = 0;
}
lastTimestamp = timestamp;
return ((timestamp - TINY_EPOCH) << SEQ_BITS) | sequence;
}
protected long tilNextMillis(long lastTimestamp) {
long timestamp = timeGen();
while (timestamp <= lastTimestamp) {
timestamp = timeGen();
}
return timestamp;
}
protected long timeGen() {
return System.currentTimeMillis() >>> (63 - EPOCH_BITS);
}
}
```
此代码片段展示了如何创建一个基于自定义纪元时间和有限范围内的序列号来生成16位整型ID的方法[^2]。需要注意的是,由于可用空间非常有限(仅16位),因此该方案可能会很快耗尽可使用的ID资源,并且不适合高并发环境下的大规模应用。
阅读全文
相关推荐














