5 个不稳定版本
0.3.1 | 2023 年 4 月 5 日 |
---|---|
0.3.0 | 2023 年 1 月 22 日 |
0.2.0 | 2022 年 10 月 13 日 |
0.1.1 | 2022 年 10 月 4 日 |
0.1.0 | 2022 年 10 月 4 日 |
#1532 在 编码
每月 242 次下载
46KB
910 行
base64id-rs
一个用于将 64 位、32 位和 16 位整数表示为 base64url 编码字符串的纯 Rust 库。
base64url i64 u64
----------- -------------------- --------------------
B21CkMCtWZA 535157120202267024 535157120202267024
fHH_W21Typg 8967229101212682904 8967229101212682904
kjsG-f3NhxI -7909720649771415790 10537023423938135826
jHamKFSl5oM -8325284168998721917 10121459904710829699
整数可以在内存中高效地存储和处理。然而,整数不能以 URL 安全的方式发送到或从 Web 客户端发送,除非使用某种编码方案。此库允许您将整数编码为/解码为 base64url 字符串。
要查看底层概念的视频,请参阅 此处。
优点
- 整数被转换为 URL 安全
- 与十六进制或十进制编码相比,编码后的整数使用的字节更少
- 从开始就在整个库中实现了对 RFC 4648 兼容性的测试
- 默认情况下,base64id 是
#![no_std]
,无需堆分配 - base64id 使用
#![forbid(unsafe_code)
动机
我在个人和项目工作中多次使用过这个概念,因为它非常实用。问题是每次我都需要重新实现这个功能。
创建此库的动机是设计和实现核心概念一次,同时注意性能、正确性和兼容性等指标。
安装
将以下内容添加到您的 Cargo.toml
文件中
[dependencies]
base64id = { version = "0.3", features = ["std"] }
对于 #![no_std]
环境,可以省略 std
cargo 功能。
使用
所有操作都使用 Id64
、Id32
和 Id16
结构体。
以下示例使用 Id64
结构体,但任何 Id__
结构体都可以等价使用。
编码
您可以将 i64
或 u64
转换为 Id64
,如下所示
use base64id::Id64;
fn main() {
let int: i64 = 1;
let id = Id64::from(int);
println!("{id}"); // AAAAAAAAAAE
}
解码
您可以使用 FromStr
和 From<i64>
将 String
转换为 Id64
,然后转换为 i64
,如下所示
use base64id::{Error, Id64};
use std::str::FromStr;
fn main() -> Result<(), Error> {
let id_str = Id64::from_str("PDFehCFVGqA")?;
let id_int = i64::from(id_str);
println!("{}", id_int); // 4337351837722417824
Ok(())
}
第三方库支持
通过使用可选的 cargo 功能标志,可以启用对 Serde、Rand 和 SQLx 的支持。
Rand
您可以使用 rand
功能标志来处理 rand
库。
use base64id::Id64;
use rand::random;
let id: Id64 = random();
println!("{id}"); // 11 random base64url characters
Serde
您可以使用 serde
功能标志来驱动 Id64
的序列化和反序列化。
use base64id::Id64;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
struct Record {
id: Id64,
}
let record = Record {
id: Id64::from(0u64),
};
println!("{}", serde_json::to_string(&record)?); // {"id":"AAAAAAAAAAA"}
SQLx
您可以使用 sqlx
功能标志来使用 SQLx SQL 命令与 Id64
。
use base64id::Id64;
use sqlx::{
sqlite::{Sqlite, SqliteConnection},
Connection,
};
use std::str::FromStr;
let id = Id64::from_str("IkoY0lQYRrI")?;
let mut conn = SqliteConnection::connect("sqlite::memory:").await?;
sqlx::query("CREATE TABLE sqlx (id INT PRIMARY KEY)")
.execute(&mut conn)
.await?;
sqlx::query("INSERT INTO sqlx VALUES (?)")
.bind(id)
.execute(&mut conn)
.await?;
let output = sqlx::query_as::<Sqlite, Id64>("SELECT id FROM sqlx LIMIT 1")
.fetch_one(&mut conn)
.await?;
println!("{output}"); // IkoY0lQYRrI
许可证
根据您的选择,许可证可以是
- Apache License,版本 2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交以包含在作品中的任何贡献,都将双重许可,如上所述,没有任何额外的条款或条件。
依赖项
~0–11MB
~130K SLoC