TUID: time-based unique identifier
Part of the rerun family of crates.
TUID:s are 128-bit identifiers, that have a global time-based order, with tie-breaking between threads. This means you can use a TUID as a tie-breaker in time series databases.
Implementation
TUID is based on two fields, both of which are monotonically increasing:
time_ns: u64inc: u64
time_ns is an approximate nanoseconds since unix epoch. It is monotonically increasing, though two TUID:s generated closely together may get the same time_ns.
inc is a monotonically increasing integer, initialized to some random number on each thread.
So the algorithm is this:
- For each thread, generate a 64-bit random number as
inc - When generating a new TUID:
- increment the thread-local
inc - get current time as
time_ns - return
TUID { time_ns, inc }
- increment the thread-local
Performance
On a single core of a 2022 M1 MacBook we can generate 40 million TUID/s, which is 25 ns per TUID.
Future work
For time-based exploits (like Meltdown/Spectre) time_ns should probably be rounded to nearest millisecond for sensitive systems. The last ~20 bits of time_ns can be filled with more randomness to lessen the chance of collisions.