Implementing

Bit layout

View this section in the spec ↗

128 bits, big-endian, a valid UUIDv8: 6 bits fixed by UUID, 122 TNID's.

Terminology

  • TNID-specific bits (122) = name (20) + data (102). UUID-specific bits (6) = UUID version (4) + UUID variant (2).
  • Data bits = TNID variant (2) + payload (100): what the 17 data characters of a TNID string encode.
  • TNID variant: the scheme for reading the payload, as a UUID's version is. Unrelated to the UUID variant.

Visual layout

One digit per bit, one group per hex digit, breaks at the UUID hyphens: 1 name, 2 UUID version, 3 UUID variant, 4 TNID variant, 5 payload.

1111.1111.1111.1111.1111.5555.5555.5555-
5555.5555.5555.5555-
2222.5555.5555.5555-
3344.5555.5555.5555-
5555.5555.5555.5555.5555.5555.5555.5555.5555.5555.5555.5555

RFC-style, 32 bits per row, most significant bit first:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                  name                 |        payload        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|            payload            |  ver  |        payload        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var| tv|                        payload                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            payload                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Components

MSB = 0: bit index from the top. LSB = 0: shift in the 128-bit integer. Hex digits count from 1, hyphens ignored.

ComponentBitsMSB = 0LSB = 0Hex digitValue
1 Name200–19108–1271–5Name encoding, null-padded at the end
5 Payload, upper2820–4780–1076–12Variant-specific
2 UUID version448–5176–7913MUST be 0x8
5 Payload, middle1252–6364–7514–16Variant-specific
3 UUID variant264–6562–6317, high 2 bitsMUST be 0b10
4 TNID variant266–6760–6117, low 2 bits0b00–0b11, selects the variant
5 Payload, lower6068–1270–5918–32Variant-specific
  • Hex digit 13 is always 8.
  • Hex digit 17 is 8, 9, a or b for TNID variants 0–3.
  • Hex digits 1–5 are the name: every user TNID starts d6157. Sorted TNIDs group by name.

Payload (100 bits)

The three runs, most significant first, form one 100-bit value, as used by the variants, the TNID string and encryption:

payload = ((id >> 80) & 0xFFFFFFF) << 72        upper, 28 bits
        | ((id >> 64) & 0xFFF) << 60            middle, 12 bits
        | id & 0xFFFFFFFFFFFFFFF                lower, 60 bits

Validating a 128-bit value

  1. UUID version is 0x8: (id >> 76) & 0xF == 0x8.
  2. UUID variant is 0b10: (id >> 62) & 0x3 == 0b10.
  3. Name bits are valid: not all null, no non-null after a null.

Every TNID variant is valid. Parsers SHOULD accept the reserved variants 2 and 3.