java生成16位long类型id
时间: 2023-09-07 21:03:11 浏览: 223
在Java中生成16位的long类型id可以通过以下几种方式来实现。
1. 时间戳加随机数:使用System.currentTimeMillis()方法获取当前时间的毫秒数,并加上一定范围内的随机数,再取长整型的后16位,作为ID值。代码示例:
```java
long id = (System.currentTimeMillis() + new Random().nextInt(9999)) & 0xFFFF;
```
2. UUID哈希:使用java.util.UUID类生成一个唯一标识符UUID,然后将其进行哈希处理,取长整型的后16位作为ID值。代码示例:
```java
UUID uuid = UUID.randomUUID();
long id = (long) Math.abs(uuid.hashCode()) & 0xFFFF;
```
3. Snowflake算法:Snowflake算法是Twitter开源的分布式ID生成算法,可以生成唯一且递增的ID。Snowflake算法的实现需要一个工作机器ID和一个序列号,根据时间戳、机器ID和序列号计算ID值。代码示例:
```java
public class SnowflakeIDGenerator {
private static final long EPOCH = 1451577600000L; // 设置一个起始时间戳,如2016-01-01 00:00:00
private static long lastTimestamp = -1L;
private static long sequence = 0L;
public synchronized static long generateID(long workerId) {
long timestamp = System.currentTimeMillis();
if (timestamp < lastTimestamp) {
throw new RuntimeException("Clock moved backwards. Refusing to generate ID.");
}
if (timestamp == lastTimestamp) {
sequence = (sequence + 1) & 0xFFFF;
if (sequence == 0) { // 当前毫秒的序列号用完,等待下一毫秒生成
timestamp = tilNextMillis(lastTimestamp);
}
} else {
sequence = 0L;
}
lastTimestamp = timestamp;
// 时间戳占41位,工作机器ID占10位,序列号占13位
long id = ((timestamp - EPOCH) << 23) | (workerId << 13) | sequence;
return id;
}
private static long tilNextMillis(long lastTimestamp) {
long timestamp = System.currentTimeMillis();
while (timestamp <= lastTimestamp) {
timestamp = System.currentTimeMillis();
}
return timestamp;
}
}
```
使用时,调用generateID方法并传入一个工作机器ID即可生成16位的long类型ID。
以上是几种常见的生成16位long类型ID的方式,在实际使用中可以根据具体需求选择合适的方式进行生成。
阅读全文