# TUID: time-based unique identifier Part of the [`rerun`](https://github.com/rerun-io/rerun) family of crates. [![Latest version](https://img.shields.io/crates/v/re_tuid.svg)](https://crates.io/crates/re_tuid) [![Documentation](https://docs.rs/re_tuid/badge.svg)](https://docs.rs/re_tuid) ![MIT](https://img.shields.io/badge/license-MIT-blue.svg) ![Apache](https://img.shields.io/badge/license-Apache-blue.svg) 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.