4 个版本
新 0.1.4 | 2024 年 8 月 20 日 |
---|---|
0.1.3 | 2024 年 7 月 28 日 |
0.1.2 | 2024 年 7 月 22 日 |
0.1.1 | 2024 年 6 月 26 日 |
0.1.0 |
|
350 在 密码学 中
每月 236 次下载
15KB
301 行
Squint
Squint 是一个库,用于将整数编码为唯一的确定字符串。
它预期用于将数据库 ID 编码为随机字符串,以实现快速的数据库索引查找并隐藏实际 ID。
库还提供了一个简单的方法来引入不同的 ID 类型(例如,UserId(1)
不应等于 CrateId(1)
,即使底层整数值相同)。
用法
基本示例
use squint::aes::{cipher::KeyInit, Aes128};
type Id = squint::Id<0>;
let key = [0; 16];
let cipher = Aes128::new(&key.into());
let id = Id::new(1, &cipher);
let encoded = id.to_string();
assert_eq!("xZV3JT8xVMefhiyrkTsd4T2", &encoded);
let decoded = encoded
.parse::<Id>()
.and_then(|id| id.to_raw(&cipher))
.unwrap();
assert_eq!(decoded, 1);
不同的 ID 类型
use squint::{
aes::{cipher::KeyInit, Aes128},
tag, Id,
};
type UserId = Id<{ tag("user") }>;
type CrateId = Id<{ tag("crate") }>;
let key = [0; 16];
let cipher = Aes128::new(&key.into());
let user_id = UserId::new(1, &cipher);
let crate_id = CrateId::new(1, &cipher);
assert_eq!("qXfXkNN9ReZCGXu3qi28xC2", &user_id.to_string());
assert_eq!("VgtE1tzjDEHnjd3fh3PwiT2", &crate_id.to_string());
比较
优点
- 公共资源 ID 最广泛采用的标准
缺点
- 非顺序的,因此数据库插入较慢
Cuid 和 NanoID 与此存储库相对于 UUID 类似
优点
- 按字典顺序可排序
- 与 UUID 兼容
缺点
- 包含创建时间戳
优点
- 可以在一个 ID 中编码多个数字
- 启用使用自动递增数据库主键
缺点
- 代码复杂性增加
- 可解码,揭示 ID 数量
- 没有内置的跨实体 ID 重用解决方案
优点
- 启用使用自动递增数据库主键
- 密码学安全
缺点
- 代码复杂性增加
依赖项
~600KB
~14K SLoC