#雪崩-id #id-生成器 #节点-id # #生成 #时间戳 #分布式系统

snowflake-rs-实现

A Rust 实现了 Twitter 的 Snowflake ID 生成算法

6 个版本 (2 个稳定版)

1.0.1 2024 年 8 月 7 日
1.0.0 2024 年 8 月 6 日
0.1.3 2024 年 8 月 6 日

#5#雪崩-id

Download history 424/week @ 2024-08-05

每月 424 次下载

MIT 许可证

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