#node-id #snowflake #system #secure

pika

皮卡 ID 在 Rust 中的实现

4 个版本

0.1.3 2023年2月7日
0.1.2 2022年8月10日
0.1.1 2022年8月9日
0.0.0 2020年5月17日

#8#node-id

MPL-2.0 许可证

12KB
256 行代码(不包括注释)

pika rs

皮卡的 Rust 实现版本

安装

[dependencies]
pika = "0.1"

基本用法

let prefixes = [
    PrefixRecord {
        prefix: "user".to_string(),
        description: Some("User ID".to_string()),
        secure: false,
    },
    PrefixRecord {
        prefix: "sk".to_string(),
        description: Some("Secret Key".to_string()),
        secure: true,
    }
];

let mut pika = Pika::new(
    prefixes.to_vec(),
    InitOptions {
        epoch: Some(1_650_153_600_000),
        node_id: None,
        disable_lowercase: Some(true),
    },
);

pika.gen("user").unwrap();
    // => user_Mzc5ODk1NTI4NzgxMTY4NjQ

pika.gen("sk").unwrap()
    // => sk_c19iMGI0NTM4ZjU3ZThjYTIyZThjNjNlMTgwOTg5MWMyM18zODA2NTE5MjcwNDc5NDYyNA

节点 ID

默认情况下,节点 ID 通过查找第一个公开网络接口设备的 MAC 地址,然后对 1024 进行取模运算来计算。

这对于较小的系统来说效果很好,但是如果有很多节点生成雪花 ID,则可能会发生冲突。在这种情况下,您应该创建一个内部单例服务,该服务维护一个已分配节点 ID 的滚动计数,从 1 到 1023。然后,生成皮卡的服务应调用此服务以获取分配的节点 ID。

然后您可以在初始化皮卡时传入节点 ID,如下所示

let mut pika = Pika::new(
    prefixes.to_vec(),
    InitOptions {
        epoch: Some(1_650_153_600_000),
        node_id: custom_node_id,
        disable_lowercase: Some(true),
    },
);

依赖项

~2.5–4MB
~68K SLoC