#unique-identifier #unique-id #id-generator #distributed #sortable #node-id #distributed-id

no-std scru64

SCRU64: Sortable, Clock-based, Realm-specifically Unique identifier

19 releases (8 stable)

2.0.1 Sep 15, 2024
1.1.1 Sep 11, 2024
1.0.0 Sep 28, 2023
0.5.0 Sep 23, 2023
0.2.1 Mar 26, 2023

#172 in Unix APIs

Download history 83/week @ 2024-08-11 45/week @ 2024-08-18 259/week @ 2024-08-25 22/week @ 2024-09-01 611/week @ 2024-09-08 378/week @ 2024-09-15 18/week @ 2024-09-22 78/week @ 2024-09-29 10/week @ 2024-10-06

885 downloads per month

Apache-2.0

81KB
1.5K SLoC

SCRU64: Sortable, Clock-based, Realm-specifically Unique identifier

Crates.io License

SCRU64 ID offers compact, time-ordered unique identifiers generated by distributed nodes. SCRU64 has the following features:

  • 63-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
// pass node ID through environment variable
// (e.g., SCRU64_NODE_SPEC=42/8 command ...)

// generate a new identifier object
let x = scru64::new_sync();
println!("{}", x); // e.g., "0u2r85hm2pt3"
println!("{}", x.to_u64()); // as a 64-bit unsigned integer

// generate a textual representation directly
println!("{}", scru64::new_string_sync()); // 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.

Crate features

Default features:

  • std integrates the library with, among others, the system clock to draw current timestamps. Without std, this crate provides limited functionality available under no_std environments.
  • global_gen (implies std) enables the new(), new_string(), new_sync(), and new_string_sync() primary entry point functions as well as the process-wide global generator under the hood.

Optional features:

  • serde enables serialization/deserialization via serde.

License

Licensed under the Apache License, Version 2.0.

See also

Dependencies

~205KB