6 个版本
0.1.5 | 2019 年 4 月 4 日 |
---|---|
0.1.4 | 2019 年 4 月 2 日 |
0.1.2 | 2019 年 3 月 26 日 |
#4 in #globally
每月 123 次下载
26KB
442 行
https://crates.io/crates/libxid
(这是 Olivier Poitrey's xid Go 库的移植)
包 xid 是一个全局唯一 ID 生成库,可以直接安全地用于服务器代码。
Xid 使用 MongoDB 对象 ID 算法生成全局唯一 ID,使用不同的序列化(base64)方式,使其作为字符串传输时更短:https://docs.mongodb.org/manual/reference/object-id/
- 4 字节表示自 Unix 纪元以来的秒数,
- 3 字节机器标识符,
- 2 字节进程 ID,以及
- 3 字节计数器,起始值为随机值。
ID 的二进制表示与 Mongo 12 字节对象 ID 兼容。字符串表示使用 base32 十六进制(无填充)以提高存储此形式时的空间效率(20 字节)。base32 的十六进制变体用于保持 ID 的可排序性。
Xid 不使用 base64,因为大小写敏感性和 2 个非字母数字字符可能在作为字符串在各种系统之间传输时成为问题。也没有保留 Base36,因为它 1/ 不是标准 2/ 结果大小不可预测(不是位对齐)3/ 不会保持可排序性。为了验证 base32 xid
,预期一个 20 个字符长、全部小写、由 a
到 v
的字母和 0
到 9
的数字组成的序列 ([0-9a-v]{20}
).
UUID 是 16 字节(128 位)且以字符串表示为 36 个字符。Twitter Snowflake ID 是 8 字节(64 位),但需要机器/数据中心配置和/或中央生成服务器。xid 处于两者之间,具有 12 字节(96 位)和更紧凑的 URL 安全字符串表示(20 个字符)。不需要配置或中央生成服务器,因此可以直接用于服务器代码。
名称 | 二进制大小 | 字符串大小 | 特性 |
---|---|---|---|
UUID | 16 字节 | 36 个字符 | 无需配置,不可排序 |
shortuuid | 16 字节 | 22 个字符 | 无需配置,不可排序 |
Snowflake | 8 字节 | 最多 20 个字符 | 需要机器/DC 配置,需要中央服务器,可排序 |
MongoID | 12 字节 | 24 个字符 | 无需配置,可排序 |
xid | 12 字节 | 20 个字符 | 无需配置,可排序 |
特性
- 大小:12 字节(96 位),小于 UUID,大于 snowflake
- 默认使用 base32 十六进制编码(作为可打印字符串传输时为 20 个字符,仍可排序)
- 未配置,您不需要设置唯一的机器和/或数据中心ID
- K-有序
- 包含1秒精度的嵌入时间
- 每秒每个主机/进程保证16,777,216(24位)唯一ID的唯一性
- 无锁(即:与UUIDv1和v2不同)
注意
- Xid依赖于系统时间,单调计数器,因此不是加密安全的。如果ID的不确定性很重要,您不应该使用xids。值得注意的是,大多数其他类似UUID的实现也不是加密安全的。如果您需要一个真正的随机ID生成器,您应该使用依赖于加密安全源的库。
参考
- https://www.slideshare.net/davegardnerisme/unique-id-generation-in-distributed-systems
- https://en.wikipedia.org/wiki/Universally_unique_identifier
- https://blog.twitter.com/2010/announcing-snowflake
使用
use libxid;
// initialize it once, reuse it afterwards
let mut g = libxid::new_generator();
for i in 0..10{
let id = g.new_id().unwrap();
println!(
"encoded: {:?} machine: {:?} counter: {:?} time: {:?}",
id.encode(),
id.machine(),
id.counter(),
id.time()
);
}
性能
目前 libxid
可以
- 在不到0.5秒内生成100万个唯一ID(不进行编码)
- 在约1.5秒内编码100万个唯一ID
- 在不到0.5秒内解码100万个唯一ID
您可以通过运行 cargo test _speed
来尝试重现这些数字,这将启动所有与速度相关的测试。
依赖项
~1.5–2.7MB
~49K SLoC