lcheylus / uuidv7

UUIDv7 in N languages

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

UUIDv7 in N languages

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!

Structure

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 to 10.
  • 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.

Implementations

CC#C++ClojureCrystalDartElixirErlangGoJavaJavaScriptJuliaKotlinLuaNimPerlPHPPythonRRubyRustShellSQLSwiftVZig

License

The Unlicense.

About

UUIDv7 in N languages

License:The Unlicense


Languages

Language:Java 6.0%Language:Swift 6.0%Language:C++ 5.3%Language:C# 5.3%Language:Rust 5.0%Language:Kotlin 4.9%Language:C 4.9%Language:Elixir 4.5%Language:Clojure 4.2%Language:Perl 4.1%Language:Go 3.9%Language:Dart 3.9%Language:TypeScript 3.7%Language:Shell 3.7%Language:JavaScript 3.7%Language:R 3.5%Language:Lua 3.3%Language:Nim 3.2%Language:PHP 3.1%Language:Python 3.0%Language:V 2.9%Language:Ruby 2.9%Language:Zig 2.7%Language:Erlang 2.4%Language:Crystal 2.3%Language:Julia 1.7%