Potřebujete identifikátor, který se nebude shodovat s žádným jiným, který by mohl kdokoliv jiný vytvořit na stroji, o kterém jste nikdy neslyšeli, aniž byste se kohokoli museli ptát na svolení? Přesně to je úkolem UUID. Jedná se o 128bitové číslo, zapsané jako 36 znaků ve známém vzoru 8-4-4-4-12, a celý jeho návrh spočívá v tom, že žádná dvě z nich nebudou stejná, i když neexistuje žádná koordinace, kdo dostane jaké. Tento bezplatný generátor je vytváří přímo ve vašem prohlížeči: vyberte verzi v poli Verze, zadejte, kolik jich potřebujete, do pole Počet a stiskněte Generovat. Stránka se otevírá s jediným identifikátorem verze v4, což je verze, kterou většina projektů požaduje, takže první identifikátor je dostupný na jediné kliknutí.
Každý identifikátor je vytvářen vaším prohlížečem pomocí Web Crypto API. Verze 4 používá funkci crypto.randomUUID() tam, kde ji prohlížeč poskytuje, a v ostatních případech crypto.getRandomValues() — kryptograficky silný zdroj náhodnosti namísto pseudo-náhodné funkce v JavaScriptu, jakou je Math.random(). Verze 7 vkládá na začátek 48bitové časové razítko (v milisekundách), poté 12bitový čítač, který se zvyšuje v rámci stejné milisekundy, a nakonec 62 náhodných bitů. Toto je metoda řazení popsaná v RFC 9562; díky tomuto čítači je vygenerovaná tisícovka hodnot seřazena, nikoli zamíchána. Verze 1 kombinuje časové razítko s náhodným identifikátorem uzlu, u kterého je nastaven multicast bit, takže nikdy nenese adresu vaší síťové karty tak, jak to dělaly původní implementace z 90. let. Verze 3 a 5 nejsou vůbec náhodné: hashují jmenný prostor spolu s názvem, pomocí MD5, respektive SHA-1, a toto hashování probíhá také na vašem zařízení. Na server se neodesílá nic, nic se nezaznamenává a jakmile je stránka načtena, funguje i bez připojení k internetu.
Verze je pole, které rozhoduje o všem ostatním. Verze 4 obsahuje 122 náhodných bitů bez jakékoliv struktury — je to výchozí volba a správná odpověď, když musí být identifikátor jednoduše jedinečný. Verze 7 zachovává 62 náhodných bitů, ale začíná časem svého vzniku, takže se jejich sada řadí podle doby vytvoření; to z ní dělá tu pravou verzi, když se identifikátor stane klíčem v databázi. Verze 1 je původní schéma založené na čase, které je zde zachováno pro systémy, jež jej stále vyžadují. Verze 3 a 5 tvoří zvláštní dvojici: jsou deterministické, což znamená, že stejné vstupy vždy produkují stejný identifikátor. Vyžadují dvě další pole — Jmenný prostor, což je jeden ze standardních prostorů DNS, URL, OID a X.500, nebo váš Vlastní prostor, a Název, což je řetězec, který je identifikován. Předáte-li verzi 5 jmenný prostor URL a hodnotu https://example.com/a, získáte stejné UUID dnes, zítra i na cizím počítači. Z tohoto důvodu pole Počet zmizí, když je vybrána v3 nebo v5: tisíc kopií jedné deterministické hodnoty by bylo jednoduše tisíc kopií jedné deterministické hodnoty. Pro všechny ostatní verze lze Počet nastavit od 1 do 1000.
Čtyři přepínače mění podobu výstupu, aniž by měnily samotných 128 bitů. Velká písmena vypíší hexadecimální číslice verzálkami, Bez pomlček vytvoří kompaktní 32znakový tvar, který vyžadují některé sloupce nebo názvy souborů, a Složené závorky obalí hodnotu do { } — tento formát Windows a svět .NET nazývají GUID. Pod nabídkou Pokročilé možnosti najdete volbu urn:uuid:, která přidá předponu, jež z něj dělá formální URN; její zapnutí automaticky vypne závorky i formát bez pomlček, protože standard definuje právě jeden tvar URN, a to ten kanonický s pomlčkami. Formát pro kopírování určuje, jak je dávka spojena při kopírování: jedna hodnota na řádek, oddělené čárkami, nebo každá hodnota v uvozovkách se závěrečnou čárkou, což je připraveno pro přímé vložení do pole v kódu. Pod výsledkem se nachází řádek, který informuje o náhodnosti v bitech — 122 pro v4, 62 pro v7 — a u verze 7 ukazuje i časové razítko zakódované v prvním identifikátoru dávky, takže čas uvnitř hodnoty je viditelný, a není třeba jej jen odhadovat. Tlačítka Kopírovat vše i Uložit do souboru obě respektují vybraný Formát pro kopírování. Historie uchovává vašich posledních 10 dávek ve vašem vlastním prohlížeči: kliknutím na některou ji můžete obnovit, můžete kopírovat nebo smazat jednotlivý záznam, případně vymazat celý seznam. Volba Vymazat vyprázdní výsledek, aniž by změnila vaše nastavení, a jakmile překročíte 50 identifikátorů, seznam se stane jedním rolovacím blokem namísto padesáti samostatných řádků.
Nejvýznamnější věcí na této stránce je rozdíl mezi v4 a v7 z pohledu primárního klíče (primary key) a to není otázka vkusu. Indexy v databázích jsou stromy (například B-tree), které se udržují seřazené, a to, kam v tomto uspořádání nový klíč dopadne, rozhoduje o tom, kolik práce vložení stojí. Klíč v4 je náhodný, takže po sobě jdoucí zápisy dopadají do nesouvisejících částí indexu: stránky (pages), které byly plné, se dělí (page split), části stromu, které databáze drží v paměti, jsou zřídka ty, které bude pro další zápis potřebovat, a index nakonec bude větší a fragmentovanější, než řádky, na které ukazuje, vyžadují. Klíč v7 začíná aktuální milisekundou, takže po sobě jdoucí záznamy dopadají vedle sebe na pravý okraj stromu, což je vzorec chování, který vytváří automaticky rostoucí celé číslo (auto-increment) a na který byly indexové struktury navrženy. To je celá podstata kompromisu: v7 vám poskytuje sekvenční chování klíče při zápisu, a přitom si zachovává tu vlastnost, kvůli které jste si UUID primárně vybrali — tedy že si ho každý může vygenerovat bez dotazování serveru. Cenou za to je, že čas vytvoření lze nyní z identifikátoru vyčíst. Zda na tom záleží, je otázkou povahy vašich dat, ne samotného formátu.
Nikdy nic nekontroluje UUID na jedinečnost; jeho zárukou je samotná jeho velikost. Neexistuje žádný registr, žádná komunikace se serverem, žádné vyhledávání — generátor vytvoří číslo a odevzdá jej, a důvodem, proč u dvou z nich nedojde ke kolizi, je jednoduše to, že pro verzi 4 existuje 2^122 možných hodnot, což je zhruba 5,3 sextilionů. Narozeninový paradox (birthday problem) představuje férový způsob, jak tuto škálu vyčíslit: potřebovali byste přibližně 2,7 trilionů identifikátorů — miliardu nových UUID každou sekundu po dobu 86 let — než by existovala 50% šance, že se libovolná dvě z nich budou shodovat. Stojí za to být přesný v tom, co to slibuje, a co ne. Jde o statistickou, nikoliv absolutní záruku, a platí jen tehdy, pokud je použitá náhodnost skutečná — špatně inicializovaný generátor nebo virtuální stroj klonovaný i se svým poolem entropie (entropy pool) tuto garanci rozbije způsobem, který formát nedokáže detekovat. Verze 7 tuto otázku ještě více zužuje: v rámci jediné milisekundy se jeden generátor nemůže zopakovat vůbec, protože čítač se postupně zvyšuje místo toho, aby házel kostkou, a u nezávislých generátorů se o zbytek postará oněch 62 náhodných bitů.
UUID je identifikátor, nikoli heslo. Verze 4 je nepředvídatelná, což lidi svádí k tomu, aby s ní zacházeli jako s tajemstvím — jako s odkazem na obnovu hesla, neuhádnutelnou URL adresou, tokenem relace nebo API klíčem. Nepředvídatelnost je sice skutečná, ale utajení je vlastnost způsobu, jakým se s hodnotou zachází, a s identifikátory se již od návrhu zachází neopatrně: vyskytují se v URL, které se zapisují do historie prohlížeče, v serverových lozích, v hlavičkách referrer a v analytických nástrojích, případně se vkládají do chatových zpráv. Ostatní verze jsou pro tento účel ještě horšími kandidáty. Jak verze 1, tak i verze 7 v sobě kódují čas vzniku, takže kdokoli má dané UUID v ruce, zhruba ví, kdy bylo vytvořeno, a může si snadno zúžit okruh na to, co se dělo ve stejném období. Verze 3 a 5 jsou z principu deterministické: UUID v5 e-mailové adresy není zahashované tajemství; je to hodnota, kterou si může kdokoliv s toutéž adresou za sekundu spočítat. Používejte UUID k pojmenovávání věcí. Pokud je nutné, aby hodnota zůstala neznámá, použijte generátor hesel nebo token z knihovny určené pro bezpečné uchovávání tajemství.
Proč zvolit tento nástroj pro UUID?
- Generování výhradně v prohlížeči: identifikátory se vytváří na vašem zařízení a nikam se neodesílají
- Náhodnost přes Web Crypto API: kryptograficky bezpečné, žádné Math.random()
- Pět verzí na jednom místě: v1, v3, v4, v5 i v7, bez nutnosti střídat různé nástroje
- Skutečně sekvenční v7: milisekundový čítač plně odpovídající specifikaci RFC 9562
- Deterministické v3 a v5 se čtyřmi standardními jmennými prostory, nebo s vaším vlastním
- Až 1000 kusů najednou, s přehledným rolovacím oknem od padesáti výše
- Všechny běžné podoby: s pomlčkami, čisté formáty, velká písmena, závorky i urn:uuid: URN
- Kopírování po řádcích, s čárkami, nebo v uvozovkách pro okamžité vložení do kódu
- Neomezené a zcela zdarma: bez registrace, bez jakýchkoliv limitů a bez zátěže serverů
UUID se objevují všude tam, kde je potřeba pojmenovat něco ještě předtím, než někdo může potvrdit, že je toto jméno volné. Aplikační kód si je vytváří pro řádky, které se chystá vložit, takže má daný objekt identitu ještě dříve, než vůbec dorazí do databáze, a klient se na něj může odkazovat, zatímco proces zápisu stále probíhá. Distribuované systémy se o ně opírají ještě více: několik různých služeb zapisujících do jedné tabulky, offline mobilní klient vytvářející záznamy na palubě letadla, nebo fronta, která musí rozpoznat zprávu, jíž již zpracovala — nic z toho nemůže čekat ve frontě na společný, centralizovaný čítač. Verze 5 pokrývá odlišnou potřebu — je to stabilní identifikátor odvozený z něčeho, co už máte: stejný dokument, stejná URL nebo stejný účet se vždy promítnou do stejného UUID, takže import může běžet dvakrát, aniž by došlo k duplicitám. Jinde jde jednoduše o formát, který daný systém vyžaduje — ať už je to korelační identifikátor protahovaný napříč logy a tracery, název souboru, který nesmí kolidovat, když nahrávání od tisíce uživatelů skončí v jednom úložišti (bucketu), klíč v registrech Windows, nebo testovací data, která musí vypadat naprosto realisticky.
Stojí za to znát několik férových omezení. Jedna dávka odpovídá vždy právě jedné verzi: hodnota nastavená v poli Verze platí pro celou dávku, takže proces generování řady v4 a generování řady v7 jsou zkrátka dvě oddělené dávky. Toto je generátor, nikoli inspektor — tato stránka neslouží k tomu, že byste vložili UUID a zjistili z něj jeho verzi či časové razítko. Tlačítko Uložit do souboru zapisuje prostý textový soubor (plain text), a to namísto formátů jako CSV nebo JSON. Verze 7 otevřeně prozrazuje, kdy přesně vznikla (s přesností na milisekundu), což je skutečný kompromis a ne nějaká chyba; verze 1 sděluje čas naprosto stejným způsobem. Pokud to pro vaše data znamená problém, je verze 4 přesně tou verzí, která nikomu neřekne vůbec nic. Dvě speciální hodnoty definované standardem nejsou ve skutečnosti žádnými verzemi, a tudíž nejsou jako možnosti k dispozici pod položkou Verze, nicméně zkopírovat si je můžete přímo odsud: nil UUID, 00000000-0000-0000-0000-000000000000, a max UUID, ffffffff-ffff-ffff-ffff-ffffffffffff. Vše na této stránce se plně řídí normou RFC 9562 — tedy specifikací, jež v roce 2024 nahradila starší RFC 4122 — takže samotný výsledek bez problémů akceptuje libovolná knihovna, databáze či API pracující s UUID. A právě v rámci těchto vymezených hranic platí jedna silná garance: každý identifikátor je zkonstruován přesně podle daného standardu, za použití skutečně silné kryptografické náhodnosti, přímo na vašem vlastním stroji, a to tak, že jej nikdo jiný nikdy ani neuvidí.