Potrebujete identifikátor, ktorý nebude v kolízii s iným, ktorý vytvoril niekto iný, na stroji, o ktorom ste nikdy nepočuli, bez toho, aby ste od niekoho žiadali povolenie? To je presne úloha, ktorú UUID plní. Je to 128-bitové číslo, zapísané ako 36 znakov v známom vzore 8-4-4-4-12, a jeho celý dizajn spočíva v tom, že žiadne dve z nich nikdy nebudú rovnaké, aj keď nič nekoordinuje, kto dostane ktoré. Tento bezplatný generátor ich vytvára vo vašom prehliadači: vyberte verziu v poli „Verzia“, zadajte, koľko ich potrebujete v poli „Počet“, a stlačte „Generovať“. Stránka sa otvorí s jediným v4, verziou, ktorú chce väčšina projektov, takže prvý identifikátor je vzdialený len jedno kliknutie.
Každý identifikátor zostavuje váš prehliadač prostredníctvom Web Crypto API. Verzia 4 používa crypto.randomUUID() tam, kde to prehliadač poskytuje, a inak crypto.getRandomValues() — kryptograficky silný zdroj náhodnosti, a nie pseudonáhodnú funkciu JavaScriptu, akou je Math.random(). Verzia 7 vkladá na začiatok 48-bitovú časovú pečiatku v milisekundách, potom 12-bitové počítadlo, ktoré sa zvyšuje v rámci tej istej milisekundy, a nakoniec 62 náhodných bitov, čo je metóda usporiadania opísaná v RFC 9562; práve kvôli tomuto počítadlu vyjde dávka tisícich kľúčov pekne poporadí, a nie pomiešaná. Verzia 1 kombinuje časovú pečiatku s náhodným identifikátorom uzla, ktorý má nastavený multicastový bit, takže nikdy nenesie adresu vašej sieťovej karty tak, ako to robili pôvodné implementácie z 90. rokov. Verzie 3 a 5 nie sú vôbec náhodné: hashujú menný priestor spolu s názvom, pomocou MD5 a SHA-1, a toto hashovanie prebieha tiež priamo na vašom zariadení. Nič sa neposiela na server, nič sa neloguje, a akonáhle sa stránka načíta, funguje aj bez pripojenia.
„Verzia“ je pole, ktoré rozhoduje o všetkom ostatnom. Verzia 4 predstavuje 122 náhodných bitov a žiadnu štruktúru — predvolená voľba a správna odpoveď vtedy, keď identifikátor musí byť jednoducho len unikátny. Verzia 7 si zachováva 62 náhodných bitov, ale začína časom, kedy bola vytvorená, takže ich množina sa zoraďuje v poradí, v akom boli vytvorené; vďaka tomu je to verzia, po ktorej treba siahnuť, keď sa identifikátor stane kľúčom v databáze. Verzia 1 je pôvodná schéma založená na čase, ponechaná tu pre systémy, ktoré si ju stále vyžadujú. Verzie 3 a 5 tvoria zvláštnu dvojicu: sú deterministické, čo znamená, že rovnaké vstupy vždy vyprodukujú rovnaký identifikátor, a vyžadujú dve ďalšie polia — „Menný priestor“, ktorým je jeden zo štandardných priestorov DNS, URL, OID a X.500 alebo vami vytvorený „Vlastný menný priestor (UUID)“, a „Názov“, čo je samotný identifikovaný reťazec. Poskytnite pre v5 menný priestor URL a https://example.com/a a dostanete úplne rovnaké UUID dnes, zajtra aj na stroji niekoho iného. Z tohto dôvodu „Počet“ zmizne, keď je zvolená v3 alebo v5: tisíc kópií deterministickej hodnoty by bolo jednoducho len tisíc kópií tej istej hodnoty. Pre každú inú verziu má „Počet“ rozsah od 1 do 1000.
Štyri prepínače menia tvar výstupu bez toho, aby zmenili podkladových 128 bitov. „Veľké písmená“ vytlačia hexadecimálne číslice ako verzálky, „Bez spojovníkov“ poskytne kompaktný 32-znakový formát, ktorý uprednostňujú niektoré stĺpce a názvy súborov, a „Zložené zátvorky“ obalia hodnotu do { } — tvar, ktorý Windows a svet .NET nazývajú GUID. Pod „Rozšírené možnosti“ pridáva urn:uuid: prefix, ktorý z neho robí formálny URN; ten vypne „Zložené zátvorky“ a „Bez spojovníkov“ po celú dobu, čo je zapnutý, pretože štandard dovoľuje presne jeden formát URN, a to je ten kanonický so spojovníkmi. „Formát kopírovania“ rozhoduje o tom, ako je dávka spojená, keď si ju prevezmete: po jednom na riadok, oddelené čiarkami, alebo každá hodnota v úvodzovkách s čiarkou na konci, čo sa dá vložiť priamo do poľa v kóde. Pod výsledkom sa nachádza riadok, ktorý udáva náhodnosť v bitoch — 122 pre v4, 62 pre v7 — a, pre v7, časovú pečiatku zakódovanú v prvom identifikátore z dávky, takže čas vo vnútri hodnoty je viditeľný namiesto toho, aby sa len predpokladal. „Kopírovať všetko“ aj „Uložiť do súboru“ rešpektujú zvolený formát kopírovania. „História“ uchováva vašich posledných 10 dávok vo vašom vlastnom prehliadači: kliknutím na niektorú si ju môžete vrátiť späť, kopírovať alebo vymazať jeden záznam, alebo vyčistiť všetko. „Vymazať“ vyprázdni výsledok, ale vaše nastavenia ponechá nezmenené, a po 50 identifikátoroch sa zoznam zmení na jeden posúvateľný blok namiesto päťdesiatich riadkov.
Vec, ktorá má na tejto stránke najväčší dopad, je rozdiel medzi v4 a v7 ako primárnym kľúčom, a nie je to vec vkusu. Databázové indexy sú stromy, ktoré sa udržiavajú zoradené, a miesto, kam v tomto poradí pristane nový kľúč, rozhoduje o tom, koľko úsilia bude vloženie stáť. Kľúč v4 je náhodný, takže po sebe nasledujúce vloženia pristanú v nesúvisiacich rohoch indexu: stránky, ktoré boli plné, sa rozdelia, časti stromu, ktoré databáza drží v pamäti, sú zriedkakedy tými časťami, ktoré bude potrebovať ďalšie vloženie, a index skončí väčší a fragmentovanejší, než by to odôvodňovali riadky, na ktoré ukazuje. Kľúč v7 sa začína aktuálnou milisekundou, takže po sebe nasledujúce vloženia pristanú vedľa seba na pravom okraji stromu, čo je vzor, ktorý produkuje inkrementujúce sa celé číslo, a vzor, pre ktorý boli indexové štruktúry vytvorené. To je celý ten kompromis: v7 vám kupuje správanie sa vkladania ako pri sekvenčnom kľúči a zároveň zachováva vlastnosť, pre ktorú ste si UUID vybrali na prvom mieste, čiže to, že si ho môže ktokoľvek vyraziť bez toho, aby žiadal server. Stojí to len to, že čas vytvorenia je teraz čitateľný vo vnútri identifikátora, a či na tom záleží, je otázka vašich dát, nie formátu.
Nič nikdy nekontroluje UUID z hľadiska jedinečnosti; jeho veľkosť je zárukou. Neexistuje tu žiaden register, žiadna cesta na server a späť, žiadne vyhľadávanie — generátor vyprodukuje číslo a odovzdá ho, a dôvodom, prečo nebudú dve z nich v kolízii, je jednoducho ten, že existuje 2^122 možných hodnôt pre v4, zhruba 5,3 sextiliónu. Narodeninový problém (birthday problem) je úprimný spôsob, ako to odhadnúť: potrebovali by ste zhruba 2,7 trilióna identifikátorov, kým by bola vyrovnaná šanca na to, že sa akékoľvek dva z nich budú zhodovať, čo predstavuje miliardu nových UUID každú sekundu počas 86 rokov. Oplatí sa byť presný v tom, čo toto sľubuje a čo nie. Je to štatistická záruka, nie aritmetická, a platí iba vtedy, kým je podkladová náhodnosť skutočná — generátor so zlou seed hodnotou, alebo virtuálny stroj klonovaný spolu so svojou zásobárňou entropie (entropy pool), to naruší spôsobom, ktorý formát nedokáže zistiť. Verzia 7 zužuje túto otázku ešte viac: v rámci jednej milisekundy sa jeden generátor vôbec nemôže zopakovať, pretože počítadlo sa zvyšuje namiesto toho, aby hádzalo kockou, a naprieč nezávislými generátormi prácu odvedie tých 62 náhodných bitov.
UUID je identifikátor, nie heslo. Verzia 4 je nepredvídateľná, a to ľudí zvádza k tomu, aby k nej pristupovali ako k tajomstvu — ako k odkazu na obnovenie hesla, neuhádnuteľnej URL, tokenu sedenia, API kľúču. Nepredvídateľnosť je skutočná, no utajenie je vlastnosťou toho, ako sa s hodnotou zaobchádza, a identifikátory sú podľa návrhu spravované neopatrne: nachádzajú sa v URL adresách, ktoré pristanú v histórii prehliadača, serverových logoch, hlavičkách referrer a analytike, a dajú sa vložiť do chatovacích správ. Ostatné verzie sú ešte horšími kandidátmi. Verzia 1 a verzia 7 obe kódujú moment vytvorenia, takže ktokoľvek má aspoň jednu, vie približne, kedy bola vytvorená, a môže zúžiť okolie všetkého, čo bolo vytvorené spolu s ňou. Verzie 3 a 5 sú zámerne deterministické: UUID v5 e-mailovej adresy nie je zahašované tajomstvo, ale hodnota, ktorú si za sekundu dokáže vypočítať ktokoľvek s touto rovnakou adresou. Na pomenovanie vecí použite UUID. Ak musí hodnota zostať neznáma, použite generátor hesiel alebo token z knižnice vytvorenej na tajomstvá.
Prečo si vybrať tento generátor UUID?
- Generovanie výlučne v prehliadači: identifikátory sa vytvárajú na vašom zariadení a nikdy sa nikam neposielajú
- Náhodnosť cez Web Crypto API: kryptograficky bezpečné, nie Math.random()
- Päť verzií na jednom mieste: v1, v3, v4, v5 a v7, bez potreby prepínania nástrojov
- Skutočne zoradené v7: počítadlo v rámci milisekundy, ako popisuje RFC 9562
- Deterministické v3 a v5 so štyrmi štandardnými mennými priestormi alebo s vaším vlastným
- Až 1000 naraz, s kompaktným posúvateľným zoznamom nad päťdesiat
- Akýkoľvek bežný tvar: so spojovníkmi, čistý, s veľkými písmenami, v zložených zátvorkách alebo ako urn:uuid: URN
- Kopírovanie ako riadky, s čiarkami alebo do úvodzoviek, z ktorých sa to priamo vloží do kódu
- Neobmedzene a bezplatne: žiadna registrácia, žiadne limity používania, nič na našich serveroch
UUID sa objavujú všade, kde niečo treba pomenovať skôr, ako niekto vôbec môže potvrdiť, že daný názov je voľný. Kód aplikácie ich vytvára pre riadky, ktoré sa chystá vložiť, takže objekt má identitu ešte predtým, než vôbec dorazí do databázy, a klient sa naň môže odvolávať, zatiaľ čo zápis ešte len prebieha. Distribuované systémy sa na ne spoliehajú ešte viac: niekoľko služieb, ktoré zapisujú do jednej tabuľky, offline mobilný klient, ktorý vytvára záznamy v lietadle, fronta, ktorá musí rozpoznať správu, ktorú už spracovala — ani jedno z nich nemôže čakať na to, kým naň príde rad pri nejakom zdieľanom počítadle. Verzia 5 pokrýva inú potrebu, ktorou je stabilný identifikátor odvodený z niečoho, čo už máte: ten istý dokument, tá istá URL alebo ten istý účet sa vždy mapujú na to isté UUID, vďaka čomu môže bežať import dvakrát bez toho, aby sa niečo duplikovalo. Inde sú zas jednoducho formátom, ktorý si nejaký systém vyžaduje — korelačný identifikátor previazaný cez logy a stopy, názov súboru, ktorý nekoliduje, keď uploady od tisícich používateľov pristanú v jednom buckete, kľúč v registroch Windows, testovacie dáta (test fixture), ktoré musia vyzerať ako tie skutočné.
Oplatí sa poznať aj pár úprimných obmedzení. Jedna dávka je jedna verzia: hodnota v poli „Verzia“ sa vzťahuje na všetko v nej, takže dávka v4 a dávka v7 sú dve dávky. Toto je generátor, nie inšpektor — vložiť UUID na zistenie jeho verzie alebo časovej pečiatky nie je to, čo by táto stránka robila. „Uložiť do súboru“ zapisuje čistý textový súbor a nie CSV či JSON. Verzia 7 otvorene odhaľuje, kedy bola vytvorená, na presnosť milisekundy, čo je skôr reálnym kompromisom než nejakou chybou, a rovnako tak čas prepúšťa aj verzia 1; ak to pre vaše dáta predstavuje problém, verzia 4 je verzia, ktorá nikomu nič neprezradí. Dve špeciálne hodnoty zo štandardu nie sú verziami a tak nie sú ani voľbami vo „Verzia“, no môžete si ich odtiaľto skopírovať: the nil UUID, 00000000-0000-0000-0000-000000000000 a the max UUID, ffffffff-ffff-ffff-ffff-ffffffffffff. Všetko na tejto stránke nasleduje štandard RFC 9562, špecifikáciu, ktorá v roku 2024 nahradila RFC 4122, takže jej výstup je prijímaný akoukoľvek knižnicou, databázou či API, ktoré vôbec s UUID nejako narába. V rámci týchto obmedzení je záruka naozaj silná: každý jeden identifikátor je zostrojený na základe tohto štandardu, z kryptograficky bezpečnej náhodnosti, na vašom vlastnom stroji, a nikto iný ho nikdy neuvidí.