caretta-id
This crate has been renamed to
grain-id. Please migrate tograin-id— it is a drop-in replacement with the same functionality.caretta-idwill no longer receive updates.
A human-friendly 7 characters identifier format (e.g. 123abcd).
For a language agnostic specification of the caretta-id format, see SPECS.md
Quick Start
use CarettaId;
let id = random;
println!; // e.g. "123abcd"
Why caretta-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
caretta-id bridges the gap between human readability and technical requirements.
Installation
Add this to your Cargo.toml:
[]
= "0.12.0"
# With optional features
= { = "0.11.0", = ["arbitrary", "serde", "rusqlite", "sea-orm", "prost", "redb", "schemars"] }
For no_std Environments
This crate support no_std.
For no_std environment, you'll need to disable default features.
[]
= { = "0.12.0", = 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.serde: Serialization/deserialization supportrusqlite: SQLite database integrationsea-orm: SeaORM ORM integrationprost: Protocol Buffers supportredb:redbintegrationschemars: JSON Schema support
Examples
use CarettaId;
// Generate random caretta-id
let caretta_id = random;
// e.g. `123abcd`
println!;
// Parse from string
let valid_id: CarettaId = "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: CarettaId = "ol2atuw".parse?;
assert_eq!;
// Convert to/from integer
let num: u64 = valid_id.into;
let id_from_int: CarettaId = num.try_into?;
assert_eq!;
// Lossy conversion from oversized int is allowed.
let id_from_overflowed_int = from_u64_lossy;
assert_eq!;
License
Licensed under either of:
- Apache License, Version 2.0 (LICENSE-APACHE)
- MIT License (LICENSE-MIT)
at your option.