#id-generator #id #generator #snowflake #distributed-id #random #sonyflake

infallible-sonyflake

受 Twitter 的 Snowflake 启发的异步/同步分布式唯一 ID 生成器

2 个版本

0.1.1 2021 年 8 月 7 日
0.1.0 2021 年 8 月 7 日

#11 in #distributed-id

Apache-2.0

31KB
547 代码行数(不含注释)

Infallible-SonyFlake

受 Twitter 的 Snowflake 启发的分布式唯一 ID 生成器。

这是原始的 sony/sonyflake 的 Rust 实现,后者是用 Go 编写的。

github docs.rs crates.io

Build codecov license

英语 | 简体中文

索尼碎片 ID 由以下组成

39 bits for time in units of 10 msec
 8 bits for a sequence number
16 bits for a machine id

安装

将以下内容添加到您的 Cargo.toml

[dependencies]
infallible-sonyflake = "0.1"

快速入门

  1. 可出错的索尼碎片
    Sonyflake 在调用 next_id 时如果时间溢出,可能会无法生成唯一的 ID。
    use infallible_sonyflake::{SonyFlake, Settings};
    use chrono::Utc;
    
    fn main() {
        let now = Utc::now();
        let mut sf = Settings::new().set_start_time(now).into_sonyflake().unwrap();
        let next_id = sf.next_id().unwrap();
        println!("{}", next_id); 
    }
    
  2. 不可出错的索尼碎片
    InfaillibleSonyFlake 如果发生时间溢出,则在调用 next_id 时始终生成唯一的 ID,它将 start_time 更新为当前时间。
    use infallible_sonyflake::{InfallibleSonyFlake, Settings};
    use chrono::Utc;
    
    fn main() {
        let now = Utc::now();
        let mut sf = Settings::new().set_start_time(now).into_infallible_sonyflake().unwrap();
        let next_id = sf.next_id();
        println!("{}", next_id); 
    } 
    
  3. 自定义机器 ID 和机器 ID 检查器
    use infallible_sonyflake::{InfallibleSonyFlake, Settings, MachineID, MachineIDChecker, IDParts, Error};
    use chrono::Utc;
    
    struct CustomMachineID {
        counter: u64,
        id: u16,
    }
    
    impl MachineID for CustomMachineID {
        fn machine_id(&mut self) -> Result<u16, Box<dyn std::error::Error + Send + Sync + 'static>> {
            self.counter += 1;
            if self.counter % 2 != 0 {
                Ok(self.id)
            } else {
                Err(Box::new("NaN".parse::<u32>().unwrap_err()))
            }
        }
    }
    
    struct CustomMachineIDChecker;
    
    impl MachineIDChecker for CustomMachineIDChecker {
        fn check_machine_id(&self, id: u16) -> bool {
            if id % 2 != 0 {
                true
            } else {
                false
            }
        }
    }
    
    fn main() {
        let mut sf = Settings::new()
            .set_machine_id(Box::new(CustomMachineID { counter: 0, id: 1 }))
            .set_check_machine_id(Box::new(CustomMachineIDChecker {}))
            .into_infallible_sonyflake().unwrap();
        let id = sf.next_id();
        let parts = IDParts::decompose(id);
        assert_eq!(parts.get_machine_id(), 1);
    
        let err = Settings::new()
            .set_machine_id(Box::new(CustomMachineID { counter: 0, id: 2 }))
            .set_check_machine_id(Box::new(CustomMachineIDChecker {}))
            .into_infallible_sonyflake().unwrap_err();
    
        assert_eq!(format!("{}", err), Error::InvalidMachineID(2).to_string());
    }
    

许可

Apache 许可证,版本 2.0 下许可。
除非您明确声明,否则您根据 Apache-2.0 许可证定义的任何有意提交以包含在此软件包中的贡献。

依赖

~5.5–7.5MB
~134K SLoC