UUIDv7 is a 128-bit unique identifier like its 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++ • Clojure • Crystal • Dart • Emacs Lisp • Elixir • Erlang • F# • Gleam • Go • Java • JavaScript • Julia • Kotlin • Lua • Nim • Nushell • Perl • PHP • Pascal • PowerShell • Python • R • Racket • Ruby • Rust • Shell • SQL • SQL Server • Swift • Tcl • V • Vimscript • Zig
The Unlicense.