雪花算法生成id的代码
时间: 2024-11-18 13:13:09 浏览: 28
雪花算法(Snowflake ID Generator),是一种分布式ID生成方案,它通过时间戳、机器标识符和序列号三个部分组合,生成高可用、无重复的64位唯一ID。以下是使用Java实现雪花算法的一个简化示例:
```java
import java.time.Instant;
import java.util.concurrent.atomic.AtomicLong;
public class SnowflakeIdWorker {
private static final long SEQUENCE_BITS = 12; // 序列号长度,占用12位
private static final long WORKER_ID_BITS = 5; // 工作机标识长度,占用5位
private static final long DATA_CENTER_ID_BITS = 5; // 数据中心标识长度,占用5位
private static final long TIMESTAMP_LEFT_SHIFT = (64 - SEQUENCE_BITS - WORKER_ID_BITS - DATA_CENTER_ID_BITS); // 时间戳左移位数
private final long workerId; // 当前工作机ID
private final long dataCenterId; // 当前数据中心ID
private final AtomicLong sequence = new AtomicLong(0L); // 序列号,每次自增1
public SnowflakeIdWorker(long dataCenterId, long workerId) {
this.dataCenterId = dataCenterId & ((1L << DATA_CENTER_ID_BITS) - 1);
this.workerId = workerId & ((1L << WORKER_ID_BITS) - 1);
}
public synchronized long nextId() {
long timestamp = currentTimestamp();
return ((timestamp << TIMESTAMP_LEFT_SHIFT)
| (dataCenterId << (WORKER_ID_BITS + TIMESTAMP_LEFT_SHIFT))
| (workerId << TIMESTAMP_LEFT_SHIFT)
| sequence.getAndIncrement());
}
private long currentTimestamp() {
return Instant.now().getEpochSecond(); // 使用当前秒数
}
}
```
这个例子中,我们首先定义了序列号、工作机ID和数据中心ID的位数,然后创建了一个AtomicLong类型的sequence用于生成递增的序列号。`nextId()`方法会获取当前的时间戳,并将所有信息拼接成最终的64位ID。
阅读全文
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)