UUIDv7 is a 128-bit unique identifier like it's older siblings, such as the widely used UUIDv4. But unlike v4, UUIDv7 is time-sortable with 1 ms precision. By combining the timestamp and the random parts, UUIDv7 becomes an excellent choice for record identifiers in databases, including distributed ones.
This repo provides zero-dependency UUIDv7 implementations in various languages. If you spot a bug — please submit a pull request. PRs for other languages are also welcome!
UUIDv7 looks like this when represented as a string:
0190163d-8694-739b-aea5-966c26f8ad91
└─timestamp─┘ │└─┤ │└───rand_b─────┘
ver │var
rand_a
The 128-bit value consists of several parts:
timestamp(48 bits) is a Unix timestamp in milliseconds.ver(4 bits) is a UUID version (7).rand_a(12 bits) is randomly generated.var* (2 bits) is equal to10.rand_b(62 bits) is randomly generated.
* In string representation, each symbol encodes 4 bits as a hex number, so the a in the example is 1010, where the first two bits are the fixed variant (10) and the next two are random. So the resulting hex number can be either 8 (1000), 9 (1001), a (1010) or b (1011).
See RFC 9652 for details.
C • C# • C++ • Dart • Elixir • Go • Java • JavaScript • Kotlin • Lua • PHP • Pascal • Python • R • Ruby • Rust • Shell • SQL • Swift • Zig • Nim
The Unlicense.