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 在 网络编程 中排名
10,012 每月下载量
在 16 个crate中(直接使用9个) 使用
60KB
855 行
cuid-rust
CUID是“针对水平扩展和二分搜索查找性能优化的抗碰撞ID。”
这是一个CUID库的rust实现,其原始JavaScript实现可在此找到此处
此库提供两种CUID算法:cuid1
和cuid2
。
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