uuid7
A Rust implementation of the proposed UUID Version 7
let uuid = uuid7;
println!; // e.g., "01809424-3e59-7c05-9219-566f82fff672"
println!; // as 16-byte big-endian array
let uuid_string: String = uuid7.to_string;
See draft-ietf-uuidrev-rfc4122bis-07.
Field and bit layout
This implementation produces identifiers with the following bit layout:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| unix_ts_ms |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| unix_ts_ms | ver | counter |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var| counter |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| rand |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Where:
- The 48-bit
unix_ts_msfield is dedicated to the Unix timestamp in milliseconds. - The 4-bit
verfield is set at0111. - The 42-bit
counterfield accommodates a counter that ensures the increasing order of IDs generated within a millisecond. The counter is incremented by one for each new ID and is reset to a random number when theunix_ts_mschanges. - The 2-bit
varfield is set at10. - The remaining 32
randbits are filled with a cryptographically strong random number.
The 42-bit counter is sufficiently large, so you do not usually need to worry
about overflow, but in an extremely rare circumstance where it overflows, this
library increments the unix_ts_ms field. As a result, the unix_ts_ms may
have a greater value than that of the system's real-time clock.
UUIDv7, by design, heavily relies on the system's wall clock to guarantee the
monotonically increasing order of generated IDs. A generator may not be able to
produce a monotonic sequence if the system clock goes backwards. This library
ignores a clock rollback and freezes the previously used unix_ts_ms unless the
clock rollback is considered significant (by default, ten seconds or more). If
such a significant rollback takes place, this library resets the generator and
thus breaks the monotonic order of generated IDs.
Crate features
Default features:
stdenables the primaryuuid7()function. Withoutstd, this crate provides limited functionality available underno_stdenvironments.
Optional features:
serdeenables the serialization and deserialization ofUuidobjects.uuid(together withstd) enables thenew_v7()function that returns the popular uuid crate'sUuidobjects.
Other functionality
This library also supports the generation of UUID version 4:
let uuid = uuid4;
println!; // e.g., "2ca4b2ce-6c13-40d4-bccf-37d222820f6f"
V7Generator provides an interface that allows finer control over the various
aspects of the UUIDv7 generation:
use V7Generator;
let mut g = new;
let custom_unix_ts_ms = 0x0123_4567_8901u64;
let x = g.generate_or_reset_core;
println!;
let y = g
.generate_or_abort_core
.expect;
println!;
License
Licensed under the Apache License, Version 2.0.