#base64-url #base64 #integer #string #16-bit #encoded-string #64-bit

无需 std base64id

高效地将 64 位、32 位和 16 位整数表示为 base64url 字符串

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编码

Download history 1347/week @ 2024-03-11 827/week @ 2024-03-18 576/week @ 2024-03-25 109/week @ 2024-04-01 78/week @ 2024-04-08 61/week @ 2024-04-15 22/week @ 2024-04-22 25/week @ 2024-04-29 8/week @ 2024-05-06 28/week @ 2024-05-13 34/week @ 2024-05-20 31/week @ 2024-05-27 46/week @ 2024-06-03 52/week @ 2024-06-10 46/week @ 2024-06-17 97/week @ 2024-06-24

每月 242 次下载

MIT/Apache

46KB
910

base64id-rs

crates.io docs.rs Rust Validation license

一个用于将 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 功能。

使用

所有操作都使用 Id64Id32Id16 结构体。

以下示例使用 Id64 结构体,但任何 Id__ 结构体都可以等价使用。

编码

您可以将 i64u64 转换为 Id64,如下所示

use base64id::Id64;

fn main() {
    let int: i64 = 1;
    let id = Id64::from(int);

    println!("{id}"); // AAAAAAAAAAE
}

解码

您可以使用 FromStrFrom<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 功能标志,可以启用对 SerdeRandSQLx 的支持。

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-2.0 许可证定义的,您有意提交以包含在作品中的任何贡献,都将双重许可,如上所述,没有任何额外的条款或条件。

依赖项

~0–11MB
~130K SLoC