# id
**Repository Path**: ALI1416/id
## Basic Information
- **Project Name**: id
- **Description**: High Performance Snowflake ID Generator 高性能雪花ID生成器
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 0
- **Created**: 2021-03-15
- **Last Updated**: 2025-12-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# High Performance Snowflake ID Generator 高性能雪花ID生成器
[](https://www.apache.org/licenses/LICENSE-2.0.txt)
[](https://openjdk.org/)
[](https://mvnrepository.com/artifact/cn.404z/id)
[](https://github.com/ALI1416/id/tags)
[](https://github.com/ALI1416/id/archive/refs/heads/master.zip)
[](https://github.com/ALI1416/id/actions/workflows/ci.yml)
[


](https://sonarcloud.io/summary/new_code?id=ALI1416_id)
## 简介
本项目根据[Twitter的雪花ID生成器](https://github.com/twitter-archive/snowflake)重构,并加上了手动设置参数、时钟回拨处理,偶数问题解决等,以及支持[SpringBoot自动配置](https://github.com/ALI1416/id-spring-boot-autoconfigure)
### 支持版本
- [主线版本](https://github.com/ALI1416/id/tree/master)
- [单机版](https://github.com/ALI1416/id/tree/single) 去除`机器码`、`机器码位数`字段,不支持分布式
## 依赖导入
```xml
cn.404z
id
3.4.0
ch.qos.logback
logback-classic
1.5.20
```
## 使用方法
### 直接调用
```java
log.info("ID {}", Id.next());
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:机器码MACHINE_ID 0 ,机器码位数MACHINE_BITS 8 ,序列号位数SEQUENCE_BITS 12 ,最大机器码MACHINE_ID 255 ;1ms最多生成ID 4096 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.IdTest -- ID 90441966306721793
```
### 手动初始化
```java
Id.init(0, 8, 14);
log.info("ID {}", Id.next());
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:机器码MACHINE_ID 0 ,机器码位数MACHINE_BITS 8 ,序列号位数SEQUENCE_BITS 12 ,最大机器码MACHINE_ID 255 ;1ms最多生成ID 4096 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.Id -- 高性能雪花ID生成器初始化:机器码MACHINE_ID 0 ,机器码位数MACHINE_BITS 8 ,序列号位数SEQUENCE_BITS 14 ,最大机器码MACHINE_ID 255 ;1ms最多生成ID 16384 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2090-09-07 23:47:35.551 ,大约可使用 69 年
// INFO cn.z.id.IdTest -- ID 361768291288481792
```
## 异常处理
### 初始化多次
```java
Id.init(0, 8, 13);
Id.init(0, 8, 15);
log.info("ID {}", Id.next());
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:机器码MACHINE_ID 0 ,机器码位数MACHINE_BITS 8 ,序列号位数SEQUENCE_BITS 12 ,最大机器码MACHINE_ID 255 ;1ms最多生成ID 4096 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.Id -- 高性能雪花ID生成器初始化:机器码MACHINE_ID 0 ,机器码位数MACHINE_BITS 8 ,序列号位数SEQUENCE_BITS 13 ,最大机器码MACHINE_ID 255 ;1ms最多生成ID 8192 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2160-05-15 15:35:11.103 ,大约可使用 139 年
// WARN cn.z.id.Id -- 已经初始化过了,不可重复初始化!
// INFO cn.z.id.IdTest -- ID 180884221449994241
```
### 初始化晚了
```java
log.info("ID {}", Id.next());
Id.init(0, 8, 12);
log.info("ID {}", Id.next());
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:机器码MACHINE_ID 0 ,机器码位数MACHINE_BITS 8 ,序列号位数SEQUENCE_BITS 12 ,最大机器码MACHINE_ID 255 ;1ms最多生成ID 4096 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.IdTest -- ID 90442134147039232
// WARN cn.z.id.Id -- 已经初始化过了,不可重复初始化!
// INFO cn.z.id.IdTest -- ID 90442134147039233
```
### 初始化异常
```java
Id.init(1000, 8, 12);
log.info("ID {}", Id.next());
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:机器码MACHINE_ID 0 ,机器码位数MACHINE_BITS 8 ,序列号位数SEQUENCE_BITS 12 ,最大机器码MACHINE_ID 255 ;1ms最多生成ID 4096 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.Id -- 高性能雪花ID生成器初始化:机器码MACHINE_ID 1000 ,机器码位数MACHINE_BITS 8 ,序列号位数SEQUENCE_BITS 12 ,最大机器码MACHINE_ID 255 ;1ms最多生成ID 4096 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// cn.z.id.IdException: 机器码MACHINE_ID 1000 无效!应为 [0,255]
```
### 阻塞
```java
// 使用较小的序列号位数初始化,可以复现阻塞
Id.init(0, 0, 1);
log.info("ID {}", Id.next());
log.info("ID {}", Id.next());
log.info("ID {}", Id.next());
log.info("ID {}", Id.next());
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:机器码MACHINE_ID 0 ,机器码位数MACHINE_BITS 8 ,序列号位数SEQUENCE_BITS 12 ,最大机器码MACHINE_ID 255 ;1ms最多生成ID 4096 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.Id -- 高性能雪花ID生成器初始化:机器码MACHINE_ID 0 ,机器码位数MACHINE_BITS 0 ,序列号位数SEQUENCE_BITS 1 ,最大机器码MACHINE_ID 0 ;1ms最多生成ID 2 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 146140533-04-25 23:36:27.903 ,大约可使用 146235604 年
// INFO cn.z.id.IdTest -- ID 172504939970
// INFO cn.z.id.IdTest -- ID 172504939971
// WARN cn.z.id.Id -- 检测到阻塞,时间 2023-09-26 15:01:09.985 ,最大序列号 1
// INFO cn.z.id.IdTest -- ID 172504939981
// WARN cn.z.id.Id -- 检测到阻塞,时间 2023-09-26 15:01:09.99 ,最大序列号 1
// INFO cn.z.id.IdTest -- ID 172504940012
```
### 时钟回拨(需要在1分钟内手动回拨时钟)
```java
for (int i = 0; i < 60; i++) {
log.info("ID {}", Id.next());
try {
Thread.sleep(1000);
} catch (Exception ignore) {
Thread.currentThread().interrupt();
}
}
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:机器码MACHINE_ID 0 ,机器码位数MACHINE_BITS 8 ,序列号位数SEQUENCE_BITS 12 ,最大机器码MACHINE_ID 255 ;1ms最多生成ID 4096 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.IdTest -- ID 90442379897602049
// INFO cn.z.id.IdTest -- ID 90442380959809536
// WARN cn.z.id.Id -- 监测到系统时钟发生了回拨。回拨时间 2023-09-26 14:02:32.663 ,上一个生成的时间 2023-09-26 15:02:55.836
// INFO cn.z.id.IdTest -- ID 90442380960858113
// INFO cn.z.id.IdTest -- ID 90442382019919872
```
### 重置初始时间戳(需要在1分钟内手动回拨时钟)
```java
for (int i = 0; i < 60; i++) {
log.info("ID {}", Id.next());
try {
Thread.sleep(1000);
} catch (Exception ignore) {
Thread.currentThread().interrupt();
}
log.info("总共回拨时间为:{}毫秒", Id.reset());
}
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:机器码MACHINE_ID 0 ,机器码位数MACHINE_BITS 8 ,序列号位数SEQUENCE_BITS 12 ,最大机器码MACHINE_ID 255 ;1ms最多生成ID 4096 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.IdTest -- ID 90442426204815360
// INFO cn.z.id.Id -- 重置开始时间戳,时钟正拨 0 毫秒
// INFO cn.z.id.IdTest -- 时钟正拨时间为:0毫秒
// WARN cn.z.id.Id -- 监测到系统时钟发生了回拨。回拨时间 2023-09-26 14:03:30.023 ,上一个生成的时间 2023-09-26 15:03:38.985
// INFO cn.z.id.IdTest -- ID 90442426205863936
// INFO cn.z.id.Id -- 重置开始时间戳,时钟正拨 3608963 毫秒
// INFO cn.z.id.IdTest -- 时钟正拨时间为:3608963毫秒
```
## 工具
```java
Id.init(3, 4, 5);
// INFO cn.z.id.Id -- 高性能雪花ID生成器预初始化:机器码MACHINE_ID 0 ,机器码位数MACHINE_BITS 8 ,序列号位数SEQUENCE_BITS 12 ,最大机器码MACHINE_ID 255 ;1ms最多生成ID 4096 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 2299-09-27 23:10:22.207 ,大约可使用 278 年
// INFO cn.z.id.Id -- 高性能雪花ID生成器初始化:机器码MACHINE_ID 3 ,机器码位数MACHINE_BITS 4 ,序列号位数SEQUENCE_BITS 5 ,最大机器码MACHINE_ID 15 ;1ms最多生成ID 32 个,起始时间 2021-01-01 08:00:00.0 ,失效时间 572874-07-26 01:58:01.983 ,大约可使用 571232 年
/* 获取配置参数 */
log.info(Arrays.toString(Id.param()));
// INFO cn.z.id.IdTest -- [3, 4, 5]
long id = Id.next();
log.info(String.valueOf(id));
// INFO cn.z.id.IdTest -- 44161594381921
/* 根据配置参数解析id */
long[] parse = Id.parse(id);
log.info(Arrays.toString(parse));
// INFO cn.z.id.IdTest -- [1695712314027, 3, 1]
/* 根据配置参数构造id(序列号为0) */
log.info(String.valueOf(Id.format(parse[0])));
// INFO cn.z.id.IdTest -- 44161594381920
/* 根据配置参数构造id */
log.info(String.valueOf(Id.format(parse[0], 1L)));
// INFO cn.z.id.IdTest -- 44161594381921
/* 解析id */
long[] parse2 = Id.parse(8L, 12L, id);
log.info(Arrays.toString(parse2));
// INFO cn.z.id.IdTest -- [1609501315778, 85, 1633]
/* 构造id */
log.info(String.valueOf(Id.format(parse2[1], 8L, 12L, parse2[0], parse2[2])));
// INFO cn.z.id.IdTest -- 44161594381921
/* 获取id的时间戳 */
log.info(String.valueOf(Id.newTimestamp(id)));
// INFO cn.z.id.IdTest -- 2023-12-23 15:13:04.144
```
更多请见[测试](./src/test)
## 性能比较
| 次数 | random.nextLong()耗时 | Id.next()耗时 | UUID.randomUUID()耗时 | 倍数 |
| ------ | --------------------- | ------------- | --------------------- | ------- |
| 100万 | 15毫秒 | 47毫秒 | 1175毫秒 | 25.0倍 |
| 1000万 | 173毫秒 | 227毫秒 | 8853毫秒 | 39.0倍 |
| 1亿 | 793毫秒 | 909毫秒 | 83628毫秒 | 92.0倍 |
| 21亿 | 36886毫秒 | 37871毫秒 | 7915039毫秒 | 209.0倍 |
## 更新日志
[点击查看](./CHANGELOG.md)
## 关于