Java项目分布式 ID 实现:雪花算法及代码详解
在Java项目中,可以使用雪花算法(Snowflake)来实现分布式ID。以下是一个简单的雪花算法实现: ```java public class SnowflakeIdWorker { // 开始时间戳(2015-01-01) private final long twepoch = 1420041600000L; // 机器id所占的位数 private final long workerIdBits = 5L; // 数据标识id所占的位数 private final long datacenterIdBits = 5L; // 支持的最大机器id,结果是31(二进制:11111) private final long maxWorkerId = -1L ^ (-1L << workerIdBits); // 支持的最大数据标识id,结果是31(二进制:11111) private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); // 序列在id中占的位数 private final long sequenceBits = 12L; // 机器ID向左移12位 private final long workerIdShift = sequenceBits; // 数据标识id向左移17位(12+5) private final long datacenterIdShift = sequenceBits + workerIdBits; // 时间戳向左移22位(5+5+12) private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; // 生成序列的掩码,这里为4095(二进制:111111111111) private final long sequenceMask = -1L ^ (-1L << sequenceBits); // 工作机器ID(0~31) private long workerId; // 数据中心ID(0~31) private long datacenterId; // 毫秒内序列(0~4095) private long sequence = 0L; // 上次生成ID的时间戳 private long lastTimestamp = -1L; public SnowflakeIdWorker(long workerId, long datacenterId) { if (workerId > maxWorkerId || workerId < 0) { throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); } if (datacenterId > maxDatacenterId || datacenterId < 0) { throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); } this.workerId = workerId; this.datacenterId = datacenterId; } 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) & sequenceMask; if (sequence == 0) { timestamp = tilNextMillis(lastTimestamp); } } else { sequence = 0L; } lastTimestamp = timestamp; return ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift) | (workerId << workerIdShift) | sequence; } protected long tilNextMillis(long lastTimestamp) { long timestamp = timeGen(); while (timestamp <= lastTimestamp) { timestamp = timeGen(); } return timestamp; } protected long timeGen() { return System.currentTimeMillis(); } public static void main(String[] args) { SnowflakeIdWorker idWorker = new SnowflakeIdWorker(0, 0); for (int i = 0; i < 1000; i++) { long id = idWorker.nextId(); System.out.println(id); } } } ``` 这个实现中,`SnowflakeIdWorker`类包含了生成分布式ID的主要逻辑。你可以通过创建`SnowflakeIdWorker`实例并调用`nextId()`方法来生成新的ID。在`main`方法中,我们创建了一个`SnowflakeIdWorker`实例,并生成了1000个ID作为示例。 ######[AI写代码神器 | 1084点数解答 | 2024-06-21 17:55:28]
- JavaScript 实现数组元素 src 转换:从原始数组到目标数组的巧妙处理(字节豆包 | 680点数解答 | 2025-08-04 17:09:03)211
- 雪花诗句数字求和:探秘 1、2、3、4 之和及相关 C++ 代码实现 (DeepSeek | 286点数解答 | 2025-12-15 17:50:18)39
- Java 实现复制粘贴功能:打造简易文本复制粘贴程序(GPT | 1497点数解答 | 2024-08-25 09:40:33)429
- 2048 游戏 HTML 代码框架解析与优化建议(字节豆包 | 138点数解答 | 2025-03-05 15:45:36)392
- 2048 游戏 HTML 框架搭建,后续开发建议大揭秘!(字节豆包 | 117点数解答 | 2025-03-11 00:06:25)344
- 深度剖析2048游戏HTML框架:待补JS逻辑与CSS样式全揭秘! (DeepSeek | 201点数解答 | 2025-04-19 11:50:42)247
- 2048游戏代码分析:优化建议与逻辑注意点揭秘(字节豆包 | 181点数解答 | 2025-04-29 20:58:02)238
- 2048 游戏 HTML 框架搭建与完善指南(字节豆包 | 202点数解答 | 2025-05-27 00:27:24)266
- 解决数据库“dm.jdbc.driver.dmexception: 数据溢出”问题的全步骤指南(阿里通义 | 598点数解答 | 2024-10-15 15:48:38)330
- 达梦数据库数据溢出问题排查及多维度解决方法(阿里通义 | 403点数解答 | 2024-10-15 15:48:41)1214
- C++ 完整代码:实现书籍信息录入与列表管理(GPT | 2245点数解答 | 2024-12-18 09:06:13)275
- App.vue 中头部代码结构与样式剖析(字节豆包 | 31点数解答 | 2025-05-14 09:58:18)262