#ksuid #segment #uuid #svix

svix-ksuid

纯 Rust 和完全测试的 KSUID 实现

6 个版本 (3 个破坏性更新)

0.8.0 2024年1月4日
0.7.0 2023年3月9日
0.6.0 2022年2月2日
0.5.3 2022年1月29日

#79并发

Download history 3215/week @ 2024-05-04 3256/week @ 2024-05-11 3146/week @ 2024-05-18 3239/week @ 2024-05-25 3477/week @ 2024-06-01 3298/week @ 2024-06-08 3123/week @ 2024-06-15 2983/week @ 2024-06-22 3024/week @ 2024-06-29 3390/week @ 2024-07-06 2822/week @ 2024-07-13 2968/week @ 2024-07-20 3254/week @ 2024-07-27 3176/week @ 2024-08-03 2075/week @ 2024-08-10 2027/week @ 2024-08-17

11,068 每月下载量
6 crates 中使用

MIT 许可证

64KB
273 代码行

Svix - 作为服务的 Webhooks

Svix-KSUID (Rust)

纯 Rust 和完全测试的 KSUID 实现

GitHub tag Crates.io Build Status Security audit docs.rs License Join our slack

此库完全兼容 Segment 的 KSUID 实现https://github.com/segmentio/ksuid

对于 Python 版本,请查看 https://github.com/svix/python-ksuid

ksuid 是什么?

ksuid 是一个 K 排序的 UID。换句话说,KSUID 还存储日期组件,因此 ksuid 可以根据创建时间进行大致排序。

了解更多 这里

用法

添加依赖项

[dependencies]
svix-ksuid = "^0.6.0"
use svix_ksuid::*;

let ksuid = Ksuid::new(None, None);
println!("{}", ksuid.to_string());
// 1srOrx2ZWZBpBUvZwXKQmoEYga2

更高的时间戳精度模式

Ksuid 有 1 秒的精度,这不足以满足所有用例。这就是为什么这个库提供了一个更高的精度模式,支持高达 4ms 的精度。

它与正常 ksuid 完全兼容,事实上,它输出有效的 ksuid。不同之处在于,它牺牲了一个字节的随机有效负载以换取这种精度。

代码也完全兼容

use svix_ksuid::*;

let ksuid = KsuidMs::new(None, None);

并且它们都实现了相同的 KsuidLike 特性。

可选功能

  • serde - 使用 serde 序列化和反序列化 KsuidKsuidMs

确保这样启用

[dependencies]
svix-ksuid = { version = "^0.6.0", features = ["serde"] }

示例

转换 Ksuid

use svix_ksuid::*;

let ksuid = Ksuid::new(None, None);

// Base62
println!("{}", ksuid.to_string()); // also: ksuid.to_base62()
// 1srOrx2ZWZBpBUvZwXKQmoEYga2

// Bytes (&[u8])
println!("{:?}", ksuid.bytes());
// [13, 53, 196, 51, 225, 147, 62, 55, 242, 117, 112, 135, 99, 173, 199, 116, 90, 245, 231, 242]

// Timestamp (time::OffsetDateTime)
println!("{:?}", ksuid.timestamp());
// 2021-05-21T20:04:03Z

// Timestamp (seconds)
println!("{}", ksuid.timestamp_seconds());
1621627443

// Payload (&[u8])
println!("{:?}", ksuid.bytes());
// [225, 147, 62, 55, 242, 117, 112, 135, 99, 173, 199, 116, 90, 245, 231, 242]

创建 Ksuid

use svix_ksuid::*;

// Timestamp is now, payload is randomly generated
let ksuid = Ksuid::new(None, None);

// Explicitly set either
let bytes = [12u8; Ksuid::PAYLOAD_BYTES];
let ksuid = Ksuid::new(Some(Utc::now()), Some(&bytes));
let ksuid = Ksuid::new(None, Some(&bytes));
let ksuid = Ksuid::new(Some(Utc::now()), None);

// From base62
let base62 = "1srOrx2ZWZBpBUvZwXKQmoEYga2";
let ksuid = Ksuid::from_base62(base62).unwrap();
let ksuid = Ksuid::from_str(base62).unwrap(); // Also implement FromStr

// From bytes
let bytes = [12u8; 20];
let ksuid = Ksuid::from_bytes(bytes.clone());
assert_eq!(&bytes, ksuid.bytes());

比较和排序 Ksuid

use svix_ksuid::*;

let ksuid1 = Ksuid::from_seconds(Some(1_555_555_555), None);
let ksuid2 = Ksuid::from_seconds(Some(1_777_777_777), None);

assert!(ksuid1 < ksuid2);
assert!(ksuid1 <= ksuid2);
assert!(ksuid1 == ksuid1);
assert!(ksuid2 > ksuid1);
assert!(ksuid2 >= ksuid1);

许可证

ksuid 源代码可在 MIT 许可证 下使用。

版权所有 Svix Webhooks 服务

依赖项

~0.8–1.2MB
~23K SLoC