9个稳定版本

新版本 1.3.3 2024年8月19日
1.3.2 2023年8月2日
1.3.1 2023年1月22日
1.2.0 2021年10月4日
0.1.0 2019年2月5日

419网络编程 中排名

Download history 2595/week @ 2024-04-28 2805/week @ 2024-05-05 2950/week @ 2024-05-12 2808/week @ 2024-05-19 2249/week @ 2024-05-26 2848/week @ 2024-06-02 2524/week @ 2024-06-09 2528/week @ 2024-06-16 1879/week @ 2024-06-23 2344/week @ 2024-06-30 2340/week @ 2024-07-07 2172/week @ 2024-07-14 2456/week @ 2024-07-21 2360/week @ 2024-07-28 2477/week @ 2024-08-04 2541/week @ 2024-08-11

10,012 每月下载量
16 个crate中(直接使用9个) 使用

MIT 许可证

60KB
855

cuid-rust

Build Status Crates.io docs.rs

CUID是“针对水平扩展和二分搜索查找性能优化的抗碰撞ID。”

这是一个CUID库的rust实现,其原始JavaScript实现可在此找到此处

此库提供两种CUID算法:cuid1cuid2

  • cuid1是一个k可排序的ID,生成速度非常快,具有非常好的随机性属性
  • cuid2提供更强的随机性保证,但生成速度较慢,且不是k可排序的

注意: CUID的原始作者认为cuid1“不安全”,因为它是k可排序的,可能会泄露生成顺序和时间的信息。我的观点是,这些属性适用于许多非常好的ID生成算法(如UUIDv7),因此选择ID的责任在于crate的用户。因此,此库将继续支持v1 CUIDs的长期使用。有关原始作者的观点的更多详细信息,请参阅此处

如果您只需要cuid2,您可以使用cuid2 crate:cuid2 crate

安装

在cargo.toml中

cuid = "1.4.0"

或者安装二进制文件

> cargo install cuid

使用方法

use cuid;

fn main() -> () {
    // V1 CUIDs and slugs
    println!("{}", cuid::cuid1().unwrap());
    println!("{}", cuid::cuid1_slug().unwrap());

    // V2 CUIDs and slugs
    println!("{}", cuid::cuid2());
    println!("{}", cuid::cuid2_slug());

    // There is a flexible constructor for v2 CUIDs to customize
    // the length, counter function, and fingerprinter (note that
    // these are const functions, so you can create a static
    // constructor if desired.
    let constructor = CuidConstructor::new()
        .with_length(20)
        .with_counter(const_counter)
        .with_fingerprinter(const_fingerprinter);
    println!("{}", constructor.create_id());
}

fn const_counter() -> u64 {
    42
}

fn const_fingerprinter() -> String {
    "fingers".to_string()
}

两种算法都可以在多线程环境中安全使用。在多线程环境中使用时,生成v1 CUIDs的线程共享同一个原子计数器,该计数器用作生成的CUID的一个组成部分,而每个生成v2 CUIDs的线程都有自己的原子计数器。

如果通过cargo install安装,此包还提供二进制文件。

其默认行为是生成一个CUID

> cuid
clzuo0vcy4djkx3p2e4p0j355

您也可以生成一个slug

>  cuid --slug
9bag9gxz78

或者v2 CUIDs/slugs

> cuid --v2
scwl6p78dpjwvdtg1rqgvi1p

>  cuid --v2 --slug
pa00dip6j2

查看 cuid --help 获取更多信息。

性能

性能是本库的主要关注点之一(见下文 基准测试)。

当前实现比v1 CUIDs的参考JavaScript实现快约20倍。我尚未对JavaScript v2 CUIDs进行基准测试。

在相对现代的桌面硬件上,生成一个CUID需要大约280纳秒,生成一个CUID缩略词需要大约200纳秒。

在长时间运行的进程或线程中,由于系统指纹只计算一次并在进程生命周期内重复使用,CUID生成更快。在这种情况下,CUID生成需要大约125纳秒。

测试

可以使用以下方式运行测试

cargo test -p cuid

某些测试由于运行缓慢而被忽略。要运行它们

cargo test -p cuid -- collisions::test --ignored --test-threads=1

某些测试需要在单个线程中运行,默认情况下被忽略。要运行它们

cargo test -p cuid -- collisions::single_thread --ignored --test-threads=1

基准测试

当使用夜间工具链运行时,可提供内联基准测试。还有位于 benches/cuid.rs 的 criterion 基准测试。

如果您在Linux系统上,建议通过 nice 使用最大可能的优先级运行基准测试,以避免系统上运行的其他进程产生的干扰效应。

$ nice -n -20 cargo bench

请注意,您可能需要以root身份运行 nice

sudo nice -n -20 su <username> -l -c "cd $PWD && cargo bench"

依赖项

约2-26MB
约354K SLoC