#random-string #id #unique-id #encode #obfuscate #sql #encryption

无 std squint

将连续整数 ID 编码为类似随机的字符串

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 2024 年 6 月 24 日

350密码学

Download history 110/week @ 2024-06-19 169/week @ 2024-06-26 27/week @ 2024-07-03 78/week @ 2024-07-17 138/week @ 2024-07-24 20/week @ 2024-07-31

每月 236 次下载

MIT/Apache

15KB
301

Squint

github crates.io docs.rs build status

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());

比较

UUID(v4)

优点
  • 公共资源 ID 最广泛采用的标准
缺点
  • 非顺序的,因此数据库插入较慢

CuidNanoID 与此存储库相对于 UUID 类似


ULID

优点
  • 按字典顺序可排序
  • 与 UUID 兼容
缺点
  • 包含创建时间戳

Sqids

优点
  • 可以在一个 ID 中编码多个数字
  • 启用使用自动递增数据库主键
缺点
  • 代码复杂性增加
  • 可解码,揭示 ID 数量
  • 没有内置的跨实体 ID 重用解决方案

此存储库

优点
  • 启用使用自动递增数据库主键
  • 密码学安全
缺点
  • 代码复杂性增加

依赖项

~600KB
~14K SLoC