6 个版本 (2 个稳定版)
1.0.1 | 2024 年 8 月 7 日 |
---|---|
1.0.0 | 2024 年 8 月 6 日 |
0.1.3 | 2024 年 8 月 6 日 |
#5 在 #雪崩-id
每月 424 次下载
12KB
125 行
雪崩 ID 生成器
Rust 实现的 Snowflake ID 生成器,可生成唯一的 64 位 ID。此实现确保线程安全和高性能,适用于分布式系统。
概述
每个 Snowflake ID 由三部分组成
- 时间戳: 41 位
- 节点 ID: 10 位
- 序列号: 12 位
位分配
- 时间戳 (41 位): 自自定义纪元以来的毫秒数。
- 节点 ID (10 位): 生成 ID 的节点的唯一标识符(0-1023)。
- 序列号 (12 位): 同一毫秒内的增量计数器。
特性
- 线程安全: 可在多个线程中安全使用。
- 自定义纪元: 允许设置自定义纪元。
- 高性能: 每秒生成大量 ID。
用法
添加到 Cargo.toml
[dependencies]
snowflake-rs-impl="*"
示例
use snowflake::Snowflake;
fn main() {
// Create a new Snowflake instance with node ID 1 and default epoch
let snowflake = Snowflake::new(1, None).unwrap();
// Generate a new ID
let id = snowflake.generate().unwrap();
println!("Generated ID: {}", id);
}
自定义纪元示例
use snowflake::Snowflake;
fn main() {
// Custom epoch (2023-01-01T00:00:00Z in milliseconds since Unix epoch)
let custom_epoch = 1672531200000;
let snowflake = Snowflake::new(1, Some(custom_epoch)).unwrap();
// Generate a new ID
let id = snowflake.generate().unwrap();
println!("Generated ID: {}", id);
}
测试
此库包含测试以验证 Snowflake ID 生成器的正确功能。
运行测试
cargo test
包含的测试
- 单线程 ID 生成:在单个线程中测量每秒生成的 ID 数。
- 多线程 ID 生成:使用多个线程测量每秒生成的 ID 数。
- 唯一性:确保所有生成的 ID 都是唯一的。
- 节点 ID 范围验证:验证使用无效节点 ID 创建 Snowflake 返回错误。
基准测试
cargo bench
约每秒 4,100,000 个 ID
依赖
~9–20MB
~259K SLoC