Crates.io | seaplane-oid |
lib.rs | seaplane-oid |
version | 0.4.0 |
source | src |
created_at | 2023-01-24 18:22:30.786945 |
updated_at | 2023-02-16 21:04:23.251942 |
description | Seaplane Object IDs |
homepage | https://seaplane.io |
repository | https://github.com/seaplane-io/seaplane/tree/main/crates/oid |
max_upload_size | |
id | 766854 |
size | 30,281 |
A library for using and handling Seaplane Object IDs.
An Object ID (OID) is a RFC4648 base32 (no padding) extended hex-encoded UUID
with a prefix separated by a -
.
For example tst-0ous781p4lu7v000pa2a2bn1gc
, by convention the prefix is three
ASCII lowercase characters, however that is a hard constraint of OIDs in
general. The current implementation limits prefixes to 3 characters, but prefix
limit could be exposed as a tunable if that need arises.
OIDs allow a "human readable subject line" in the form of the prefix, where actual data is a UUID. This means while debugging or reviewing a system it's trivial to determine if an incorrect OID was passed in a particular location by looking at the prefix. This isn't easily achievable with bare UUIDs.
Base32 encoding the UUID also allows compressing the data into a smaller and more familiar format for humans, akin to a commit hash.
The downside to OIDs is a layer of indirection when handling IDs and values, it's not immediately obvious that the OIDs are a prefixed UUID. Additionally, the prefixes must be controlled in some manner including migrated on changes which adds a layer of complexity at the application layer.
There is also additional processing overhead compared to a bare UUID in order to encode/decode as well as handling the appending and removing the prefixes.
However, we believe the drawbacks to pale in comparison to the benefits derived from the format.
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(())
}
Licensed under the Apache License, Version 2.0, LICENSE. Copyright 2023 Seaplane IO, Inc.