7 个不稳定版本 (3 个破坏性版本)

0.4.0 2023年2月16日
0.3.3 2023年2月3日
0.3.2 2023年1月27日
0.2.0 2023年1月25日
0.1.0 2023年1月24日

#201 in 值格式化


用于 seaplane

Apache-2.0

23KB
368

容器镜像引用

Rust Version crates.io Dependency Status

一个用于使用和处理 Seaplane 对象 ID 的库。

关于

对象 ID (OID) 是一个以前缀分隔的 RFC4648 base32(无填充)扩展十六进制编码的 UUID。

例如 tst-0ous781p4lu7v000pa2a2bn1gc,根据惯例,前缀是三个 ASCII 小写字母,但这通常是 OID 的一般硬约束。当前实现将前缀限制为 3 个字符,但如果需要,前缀限制可以公开为可调。

产品理念

OID 允许以前缀的形式具有“可读性较高的主题行”,其中实际数据是 UUID。这意味着在调试或审查系统时,通过查看前缀就可以轻松地确定是否在特定位置传递了错误的 OID。这使用裸 UUID 是无法轻易实现的。

对 UUID 进行 Base32 编码也允许将数据压缩成更小、更易于人类阅读的格式,类似于提交哈希。

反对观点

OID 的缺点是在处理 ID 和值时存在一层间接性,OID 是一个带前缀的 UUID 并不是立即显而易见的。此外,必须以某种方式控制前缀,包括在更改时迁移,这为应用层添加了一层复杂性。

与裸 UUID 相比,OID 还存在额外的处理开销,包括编码/解码以及处理前缀的追加和删除。

然而,我们认为这些缺点与由此格式带来的好处相比微不足道。

示例

use seaplane_oid::{error::*, Oid};

fn main() -> Result<()> {
    // OIDs can be created with a given prefix alone, which generates a new
    // UUID
    let oid = Oid::new("exm")?;
    println!("{oid}");

    // OIDs can be parsed from strings, however the "value" must be a valid
    // base32 encoded UUID
    let oid: Oid = "tst-0ous781p4lu7v000pa2a2bn1gc".parse()?;
    println!("{oid}");

    // OIDs can also be created from the raw parts
    let oid = Oid::with_uuid(
        "exm",
        "063dc3a0-3925-7c7f-8000-ca84a12ee183"
            .parse::<Uuid>()
            .unwrap(),
    )?;

    // One can retrieve the various parts of the OID if needed
    println!("Prefix: {}", oid.prefix());
    println!("Value: {}", oid.value());
    println!("UUID: {}", oid.uuid());

    Ok(())
}

许可

许可协议为 Apache 许可协议第 2 版,LICENSE。版权所有 2023 Seaplane IO,Inc。

依赖关系

~2MB
~43K SLoC