Generátor UUID

Generujte UUID v prohlížeči: plně náhodné v4, sekvenční v7 pro databázové klíče, nebo deterministické v5. Až 1000 hodnot najednou bez odesílání dat na server.

Klikněte na „Generovat“ pro zobrazení výsledku
Verze
Pokročilé možnosti

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?

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í.

FAQ

Jak vygenerovat UUID?

Vyberte požadovanou variantu v poli Verze, v poli Počet nastavte, kolik jich potřebujete, a stiskněte Generovat. Stránka se zpočátku otevírá s jedním identifikátorem verze 4, což je přesně to, co valná část projektů vyžaduje, a běžné UUID je tak na jediné kliknutí daleko. Každá výsledná hodnota se zobrazuje s vlastním tlačítkem pro kopírování, přičemž volba Kopírovat vše nabere jedním klikem celou dávku.

Jaký je rozdíl mezi UUID v4 a v7?

Verze 4 je složena ze 122 náhodných bitů, a to bez jakékoliv vnitřní struktury, z čehož vyplývá, že žádná dvě taková UUID nemají k sobě navzájem žádný vztah. Naproti tomu verze 7 využívá prvních 48 bitů pro záznam přesné milisekundy, ve které vznikla, následně přidává čítač a nakonec 62 náhodných bitů. Je tedy plně tříditelná: dávka je vždy seřazena podle pořadí, v jakém byla vytvořena. Verzi 4 použijte v okamžiku, kdy daný identifikátor musí být jednoduše jedinečný; verzi 7 pak volte pro situace, kdy se tento identifikátor stane klíčem v databázi.

Jakou verzi UUID bych měl použít?

Verzi 4, pokud prokazatelně nemáte konkrétní důvod vybrat si verzi jinou. Pro verzi 7 se rozhodněte v momentě, kdy z identifikátoru vytvoříte primární klíč (primary key) a výkon při vkládání řádků je pro vás důležitý. K verzi 5 sáhněte ve chvíli, kdy od téhož vstupu potřebujete vytrvale stejný a stálý identifikátor. Verze 1 je vyhrazena striktně pro systémy, se kterými musíte komunikovat a které si ji vysloveně žádají. Verze 3 je de facto identická s verzí 5, ale sází na starší MD5 namísto SHA-1, a existuje proto už pouze z důvodu zpětné kompatibility.

Jsou vygenerované UUID hodnoty skutečně náhodné a bezpečné?

Generovaná náhodnost disponuje plnou kryptografickou bezpečností: dodává ji přímo Web Crypto API vašeho webového prohlížeče, a sice prostřednictvím crypto.randomUUID() či crypto.getRandomValues(), nikoli z pochybného zdroje v podobě Math.random(). Pojem bezpečnosti ve smyslu nepředvídatelnosti se však výrazně odlišuje od bezpečnosti, jež spočívá v trvalém utajení (tajemství) — UUID zastává úlohu identifikátoru a nemělo by proto nikdy figurovat coby přístupové heslo, relační token nebo citlivý klíč pro API rozhraní.

Lze vygenerovat velké množství UUID naráz?

Ano, jedním rázem se lze dostat až na hodnotu 1000 kusů. Nastavte si konkrétní hodnotu do okénka Počet a zmáčkněte Generovat. Nad limit padesáti kusů změní finální výsledek podobu — ze sáhodlouhého roztahaného výčtu řádků se překlopí do podoby jednoho proscrollovatelného bloku. Příkazy Kopírovat vše a Uložit do souboru vezmou naráz naprosto celou dávku a scelí ji přesně do podoby, na kterou ukazuje volba Formát pro kopírování: jednotlivé položky pod sebou na zvláštním řádku, oddělené výlučně čárkou, či naopak zabalené úhledně v uvozovkách, takže je lze pohotově vložit jako pole do programového kódu.

Proč v3 a v5 vracejí pokaždé ten samý UUID?

Protože přesně s tímto a výlučně s tímto záměrem vznikly. Verze 3 i 5 nesou přízvisko deterministické, neboť vždycky vezmou poskytnutý jmenný prostor i samotný název a ty zahashují. Ty samé vstupy pak neomylně končí týmž finálním identifikátorem bez ohledu na to, ke kterému stroji zrovna sednete a pro který programovací jazyk píšete. K užitku jsou tím pádem primárně u vyvozování spolehlivých, trvalých a neměnných jmen či znaků (identifikátorů) pro něco hmatatelného, co jste již s to uchopit do rukou. A přesně to je ten samý důvod, proč u nich kolonka Počet nenávratně mizí, zrovna když je zvolíte jako vaši cílovou destinaci.

Co jsou to vlastně Jmenný prostor a Název, a který jmenný prostor bych si měl vybrat?

Jsou to oba výchozí vstupní podklady pro celkový výpočet UUID páté nebo třetí verze. Pole Jmenný prostor zjevuje druh oboru (odvětví), v němž název bezprostředně sídlí — doména jmenného systému DNS obslouží hostitelská jména, prostor URL schytá veškeré internetové adresy, stopy OID plus X.500 poslouží význačně u adresářových norem. Pokud disponujete jakoukoli neukojenou nutkavou touhou vetknout dovnitř váš vlastní soukromý identifikační vzor, nabídne Vlastní jmenný prostor (UUID) možnost poskytnout k tomuto výkonu svůj prostor domovský — což jest zcela nepochybně běžná rutina za zdmi úzkostlivě chráněných interních aplikací. Zato položka Název jest samotný obnažený řetězec. Přes to přese všechno ale docílíte docela prapodivně pestrých diametrálních rozdílů ve vygenerovaných výsledcích ze zcela totožných názvů už tehdy, pakliže mezi jmennými prostory přeskočíte jen nepatrně a změníte v nich pouhý chloupek, což je ve svém nitru ten prazáklad, o nějž tyto rozličné množiny od počátku a s pýchou usilují.

Proč je UUID v7 lepším primárním klíčem pro databázi než v4?

Kvůli tomu, kam v indexu dopadají hodnoty. Index je udržován seřazený a náhodný klíč v4 může dopadnout kamkoliv, takže vkládání dělí stránky po celém stromě a části držené v paměti jsou zřídka ty, které jsou potřebné vzápětí. Klíč v7 začíná aktuální milisekundou, takže po sobě jdoucí záznamy dopadají vedle sebe na konec indexu, což je způsob, jakým se chová sekvenční celočíselný klíč — a zároveň umožňuje jakékoliv službě vytvořit identifikátor bez dotazování centrálního čítače.

Mohou někdy být dvě UUID stejná?

Teoreticky ano, v praxi ne, a stojí za to vědět proč. Nic nekontroluje jedinečnost: jednoduše existuje 2^122 možných hodnot pro verzi 4, což je asi 5,3 sextilionů, a potřebovali byste zhruba 2,7 trilionů — miliardu za sekundu po dobu 86 let — než by byla 50% šance na jedinou kolizi. Záruka je statistická spíše než absolutní a závisí na tom, zda je náhodnost skutečná, což je důvod, proč tento generátor používá Web Crypto API místo běžné pseudo-náhodné funkce.

Mohu použít UUID jako heslo, API klíč nebo token relace?

Ne, a to je chyba, která stojí nejvíce. UUID verze 4 je nepředvídatelné, ale s identifikátory se zachází jako by byly veřejné: končí v URL, historii prohlížeče, serverových logách, hlavičkách referrer a analytikách. Verze 1 a 7 navíc prozrazují, kdy byly vytvořeny, a verze 3 a 5 může kdokoliv přepočítat, pokud zná vstupy. Pro všechno, co musí zůstat utajeno, použijte generátor hesel nebo token z knihovny určené pro tajemství.

Prozrazuje UUID v7, kdy bylo vytvořeno?

Ano, s přesností na milisekundu, a je to záměr, nikoliv přehlédnutí — časové razítko je to, co dělá v7 seřaditelným. Řádek pod výsledkem vám ukazuje čas zakódovaný v první hodnotě dávky, takže přesně vidíte, co je odhaleno. Verze 1 nese časové razítko také. Pokud je čas vytvoření něco, co byste raději nezveřejňovali, verze 4 neobsahuje žádný čas vůbec.

Odhaluje UUID v1 moji MAC adresu?

Zde ne. Původní schéma používalo adresu síťové karty počítače jako pole uzlu, z čehož pochází pověst verze 1, ale standard umožňuje i náhodný identifikátor uzlu označený multicast bitem, a přesně to tento generátor produkuje. Vaše hardwarová adresa se nikdy nečte a nikdy se neobjevuje ve výstupu.

Co mění možnosti Velká písmena, Bez pomlček, Složené závorky a urn:uuid:?

Pouze prezentaci — 128 bitů uvnitř je v každém tvaru identických. Velká písmena vypíšou hexadecimální číslice verzálkami, Bez pomlček nabídne kompaktní 32znakovou verzi, Složené závorky obalí hodnotu do { } (tak, jak zapisují GUID Windows a .NET) a urn:uuid: přidá předponu, která z něj vytvoří formální URN. urn:uuid: vypne zbylé dvě volby, když je zapnuté, protože standard definuje přesně jeden formát URN a tím je kanonický tvar s pomlčkami.