110 releases (15 breaking)

new 0.17.0-alpha.3 May 27, 2024
0.16.1-rc.1 May 28, 2024
0.15.0-alpha.5 Mar 29, 2024
0.12.0-alpha.2 Dec 26, 2023
0.4.0 Mar 28, 2023

#621 in Rust patterns

Download history 1305/week @ 2024-02-05 2341/week @ 2024-02-12 3426/week @ 2024-02-19 5104/week @ 2024-02-26 5504/week @ 2024-03-04 4758/week @ 2024-03-11 3999/week @ 2024-03-18 2993/week @ 2024-03-25 3462/week @ 2024-04-01 5564/week @ 2024-04-08 5405/week @ 2024-04-15 5565/week @ 2024-04-22 4749/week @ 2024-04-29 4270/week @ 2024-05-06 8535/week @ 2024-05-13 7881/week @ 2024-05-20

25,546 downloads per month
Used in 49 crates (4 directly)

MIT/Apache

15KB
145 lines

TUID: time-based unique identifier

Part of the rerun family of crates.

Latest version Documentation MIT Apache

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: u64
  • inc: 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 }

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.

Dependencies

~290–770KB
~14K SLoC