Struktura UUID
UUID (Universally Unique Identifier) je 128bitová hodnota reprezentovaná jako 32 hexadecimálních číslic rozdělených do pěti skupin pomlčkami:
Verze a varianta jsou jediná dvě pole zaručeně přítomná v každém UUID. Všechna ostatní pole závisí na verzi.
Pole verze
Nibble verze je první hexadecimální číslice třetí skupiny (pozice 14 v plném řetězci). Identifikuje, která verze UUID byla použita ke generování identifikátoru.
const hex = uuid.replace(/-/g, '') const version = parseInt(hex[12], 16) // single hex digit → 1, 2, 3, 4, 5, 6, 7, or 8
Verze 7 (UUID v7) je nejnovější široce používaná verze, zavedená v RFC 9562 (2024). Kóduje Unix millisekudové časové razítko ve vysokých bitech pro seřaditelnost.
Pole varianty
Varianta je kódována ve vysokých bitech prvního bajtu čtvrté skupiny. Identifikuje konvence rozvržení a pořadí bajtů používané UUID.
| Vysoké bity | Rozsah první hexadecimální číslice | Varianta | Popis |
|---|---|---|---|
| 0xxx xxxx | 0x00–0x7F | Zpětná kompatibilita NCS | Starší UUID Network Computing System (NCS). Rezervováno pro zpětnou kompatibilitu. |
| 10xx xxxx | 0x80–0xBF | RFC 4122 / RFC 9562 | Standardní varianta UUID RFC 4122 / RFC 9562. Používána všemi moderními verzemi UUID (v1–v8). |
| 110x xxxx | 0xC0–0xDF | Zpětná kompatibilita Microsoft | Starší Microsoft COM/DCOM GUIDs s jiným pořadím bajtů. Stále se vyskytuje v komponentách Windows COM. |
| 111x xxxx | 0xE0–0xFF | Rezervováno | Rezervováno pro budoucí definici. Nepoužíváno žádnou aktuální verzí UUID. |
V praxi téměř všechna UUID, se kterými se setkáte, používají variantu RFC 4122 / RFC 9562 (vzor bitů 10xx xxxx, první byte čtvrté skupiny v rozsahu 0x80–0xBF). Varianty NCS, Microsoft COM a Reserved jsou starší formáty, které se v moderních systémech vyskytují jen zřídka.
Reference verzí UUID
RFC 4122 definovalo verze 1–5. RFC 9562 (2024) přidalo verze 6, 7 a 8:
| Verze | Název | Standard | Popis |
|---|---|---|---|
| v1 | Na základě času | RFC 4122 | Časové razítko (gregoriánská epocha, přesnost 100ns) + MAC adresa. Sekvenční na hostitele, ale prozrazuje identitu hostitele. |
| v2 | DCE Security | RFC 4122 | Založeno na UUID v1 s polem time_low nahrazeným POSIX UID/GID. Zřídka používáno mimo starší systémy DCE/RPC. |
| v3 | Na základě názvu MD5 | RFC 4122 | Deterministické: MD5 hash UUID jmenného prostoru + řetězce názvů. Stejné vstupy vždy dávají stejné UUID. Preferujte v5. |
| v4 | Náhodné | RFC 4122 | 122 bitů kryptograficky bezpečné náhodnosti. Nejběžnější verze UUID pro obecné účely. |
| v5 | Na základě názvu SHA-1 | RFC 4122 | Jako v3, ale používá SHA-1. Odolnější vůči kolizím než MD5. Preferováno před v3 pro nová UUID na základě názvů. |
| v6 | Přeuspořádaný čas | RFC 9562 | Přeuspořádá pole časového razítka UUID v1, takže UUID je chronologicky seřaditelné. Definováno v RFC 9562. |
| v7 | Unix čas | RFC 9562 | 48bitové Unix millisekudové časové razítko ve vysokých bitech + náhodná data. Seřaditelné a přívětivé pro B-tree index. Preferováno pro nová časově uspořádaná ID. |
| v8 | Vlastní | RFC 9562 | Volná forma: všechny bity kromě verze a varianty jsou definovány aplikací. Není specifikován žádný algoritmus generování. |
Dekódování časových razítek UUID v1
UUID v1 obsahuje 60bitové gregoriánské časové razítko (intervaly 100 nanosekund od 15. října 1582) rozdělené přes tři pole: time_low (bity 0–31), time_mid (bity 32–47) a time_hi (bity 48–59). Tento nástroj je znovu sestaví a převede na standardní datum UTC.
// UUID v1: 6ba7b810-9dad-11d1-80b4-00c04fd430c8 // ^^^^^^^^ ^^^^ ^^^^ ^^^^^ ^^^^^^^^^^^^ // time-low mid hi clk node (MAC) // ^ // version nibble (1) const hex = '6ba7b8109dad11d180b400c04fd430c8' const tLow = parseInt(hex.slice(0, 8), 16) // 0x6ba7b810 const tMid = parseInt(hex.slice(8, 12), 16) // 0x9dad const tHi = parseInt(hex.slice(13, 16), 16) // 0x1d1 (skip version nibble at index 12) // Reconstruct 60-bit timestamp (100-ns intervals since Oct 15, 1582) const t = (BigInt(tHi) << 48n) | (BigInt(tMid) << 32n) | BigInt(tLow) // Subtract Gregorian offset (Oct 15, 1582 → Jan 1, 1970 in 100-ns units) const GREGORIAN_OFFSET = 122192928000000000n const unixMs = (t - GREGORIAN_OFFSET) / 10000n console.log(new Date(Number(unixMs)).toISOString()) // → 1998-02-04T22:13:53.578Z
UUID v1 by mělo být považováno za citlivé: vložená MAC adresa a přesné časové razítko mohou identifikovat jak generující stroj, tak čas generování.
Dekódování časových razítek UUID v7
UUID v7 obsahuje 48bitové Unix millisekudové časové razítko v prvních 48 bitech (první skupina + první 4 číslice druhé skupiny). Tento nástroj tyto bity čte a převádí na datum UTC s přesností na milisekundy.
// UUID v7: 018e4bc8-1000-7000-8000-000000000001 // ^^^^^^^^^^^^ // 48-bit Unix ms timestamp const hex = '018e4bc8100070008000000000000001' // First 48 bits (12 hex chars) = Unix timestamp in milliseconds const ms = parseInt(hex.slice(0, 12), 16) // 0x018e4bc81000 console.log(new Date(ms).toISOString()) // → 2024-03-11T…Z // Everything after byte 6 is random (except version/variant bits)
Na rozdíl od UUID v1 používá časové razítko UUID v7 známou Unix epochu (1. ledna 1970) a nevkládá žádné informace o hostiteli. Zbývajících 74 bitů je náhodných.
Jak tento nástroj detekuje verzi a variantu UUID
Dekodér čte pozici 14 (nibble verze) a pozici 19 (nibble varianty) kanonického řetězce UUID. Není potřeba žádný externí stav nebo kontext — všechny informace jsou obsaženy v řetězci UUID.
// Detect UUID version from the 13th hex character (index 12)
function uuidVersion(uuid) {
const clean = uuid.replace(/-/g, '')
return parseInt(clean[12], 16)
}
uuidVersion('550e8400-e29b-41d4-a716-446655440000') // → 4
uuidVersion('018e4bc8-1000-7000-8000-000000000001') // → 7
uuidVersion('6ba7b810-9dad-11d1-80b4-00c04fd430c8') // → 1
// Detect variant from the 17th hex character (index 16, first char of 4th group)
function uuidVariant(uuid) {
const clean = uuid.replace(/-/g, '')
const b = parseInt(clean[16], 16)
if ((b & 0x8) === 0) return 'NCS'
if ((b & 0xC) === 0x8) return 'RFC 4122'
if ((b & 0xE) === 0xC) return 'Microsoft'
return 'Reserved'
}Speciální UUID
Nil UUID
Nil UUID 00000000-0000-0000-0000-000000000000 je samé nuly. Je definováno RFC 4122 jako sentinelová hodnota znamenající 'žádné UUID' — analogicky k null. Není to platné vygenerované UUID.
Max UUID
Max UUID ffffffff-ffff-ffff-ffff-ffffffffffff je samé jedničky (0xFF v každém bajtu). Definováno v RFC 9562, je to doplněk nil UUID a slouží jako maximální sentinelová hodnota.