Expand description
Compact, human-readable unique IDs — grain-sized, yet enough for a lifetime.
For a language agnostic specification of the grain-id format, see SPECS.md
§Quick Start
use grain_id::GrainId;
let id = GrainId::random();
println!("{}", id); // e.g. "123abcd"§Why grain-id?
Traditional identifier systems face challenges in distributed environments:
- Sequential numbers (like GitHub issue numbers) cause collisions in distributed systems
- UUIDs are too long and not human-friendly
- Short hashes (like Git commit hashes) lack standardization
grain-id bridges the gap between human readability and technical requirements.
§Installation
Add this to your Cargo.toml:
[dependencies]
grain-id = "0.14.1"
# With optional features
grain-id = { version = "0.15.0", features = ["arbitrary", "serde", "rusqlite", "sea-orm", "prost", "schemars"] }§For no_std Environments
This crate support no_std.
For no_std environment, you’ll need to disable default features.
[dependencies]
grain-id = { version = "0.14.1", default-features = false }§Features
- Human-friendly: Easy to read, type, and communicate
- Collision-resistant: Sufficient entropy for personal distributed systems
- Compact: Shorter than UUIDs while maintaining uniqueness
- Type-safe: Rust implementation with strong typing
- Multiple integrations: Support for serde, rusqlite, sea-orm, and protobuf
§Optional Feature Flags
arbitrary:arbitrary::Arbitrarysupport for fuzzing tests.digest: Hash-basedGrainIdgeneration via [digest::Digest] trait.serde: Serialization/deserialization supportrusqlite: SQLite database integrationsea-orm: SeaORM ORM integrationprost: Protocol Buffers supportschemars: JSON Schema support
§Examples
use grain_id::GrainId;
// Generate random grain-id
let grain_id = GrainId::random();
// e.g. `123abcd`
println!("'{}'", grain_id);
// Parse from string
let valid_id: GrainId = "012atvw".parse()?;
// When decoding from BASE32, ambiguous characters (1/l/I, 0/o, v/u) are treated as 1, 0 and v respectively, so they do not cause errors.
let also_valid_id: GrainId = "ol2atuw".parse()?;
assert_eq!(valid_id, also_valid_id);
// Convert to/from integer
let num: u64 = valid_id.into();
let id_from_int: GrainId = num.try_into()?;
assert_eq!(valid_id, id_from_int);
// Lossy conversion from oversized int is allowed.
let id_from_overflowed_int = GrainId::from_u64_lossy(GrainId::CAPACITY + num);
assert_eq!(valid_id, id_from_overflowed_int);
Modules§
- alphabet
- Provides constants and private functions about encoding/decoding alphabet.
- proto
prost - Provides message types generated by prost-build. Provides protobuf messages.
Structs§
- GrainId
- Grain id struct
- Grain
IdPrefix std - A prefix for filtering or querying
GrainIdvalues by their string representation.
Enums§
- Error
- A general error that can occur when working with grain-ids.
Type Aliases§
- Grain
IdPrefix Proto prostandstd - Alias of
proto::GrainIdPrefix - Grain
IdProto prost - Alias of
proto::GrainId