# SCRU64: Sortable, Clock-based, Realm-specifically Unique identifier
[](https://crates.io/crates/scru64)
[](https://github.com/scru64/rust/blob/main/LICENSE)
SCRU64 ID offers compact, time-ordered unique identifiers generated by
distributed nodes. SCRU64 has the following features:
- ~62-bit non-negative integer storable as signed/unsigned 64-bit integer
- Sortable by generation time (as integer and as text)
- 12-digit case-insensitive textual representation (Base36)
- ~38-bit Unix epoch-based timestamp that ensures useful life until year 4261
- Variable-length node/machine ID and counter fields that share 24 bits
```rust
// pass node ID through environment variable
std::env::set_var("SCRU64_NODE_SPEC", "42/8");
// generate a new identifier object
let x = scru64::new();
println!("{x}"); // e.g. "0u2r85hm2pt3"
println!("{}", x.to_u64()); // as a 64-bit unsigned integer
// generate a textual representation directly
println!("{}", scru64::new_string()); // e.g. "0u2r85hm2pt4"
```
See [SCRU64 Specification] for details.
SCRU64's uniqueness is realm-specific, i.e., dependent on the centralized
assignment of node ID to each generator. If you need decentralized, globally
unique time-ordered identifiers, consider [SCRU128].
[SCRU64 Specification]: https://github.com/scru64/spec
[SCRU128]: https://github.com/scru128/spec
## Crate features
Default features:
- `std` enables the primary `new()` and `new_string()` functions and configures
`generator::Scru64Generator` with the system clock. Without `std`, this crate
provides limited functionality available under `no_std` environments.
Optional features:
- `serde` enables serialization/deserialization via serde.
- `tokio` enables the `async_tokio::new()` and `async_tokio::new_string()`
functions, the non-blocking counterpart of `new()` and `new_string()`.
## License
Licensed under the Apache License, Version 2.0.
## See also
- [docs.rs/scru64](https://docs.rs/scru64)