Kas vajad identifikaatorit, mis ei läheks vastuollu teisega, mille on loonud keegi teine masinas, millest sa pole kunagi kuulnud, ilma et peaksid kelleltki luba küsima? Just see on UUID töö. See on 128-bitine arv, mis kirjutatakse 36 tähemärgina tuttavas 8-4-4-4-12 mustris, ja selle kogu disain seisneb selles, et kaks neist ei ole kunagi samasugused, isegi kui keegi ei koordineeri, kes millise saab. See tasuta generaator loob neid sinu brauseris: vali «Versioon», ütle «Arv» all, mitut vajad, ja vajuta «Genereeri». Leht avaneb ühe v4 identifikaatoriga, mis on versioon, mida enamik projekte soovib, nii et esimene identifikaator on vaid ühe kliki kaugusel.
Iga identifikaatori loob sinu brauser läbi Web Crypto API. Versioon 4 kasutab crypto.randomUUID() seal, kus brauser seda pakub, ja muul juhul crypto.getRandomValues() — krüptograafiliselt tugevat juhuslikkuse allikat, mitte pseudo-juhuslikku JavaScripti funktsiooni nagu Math.random(). Versioon 7 paneb esikohale 48-bitise millisekundilise ajatempli, seejärel 12-bitise loenduri, mis kasvab sama millisekundi sees, ning seejärel 62 juhuslikku bitti, mis on RFC 9562 kirjeldatud järjestusmeetod; see loendur on põhjus, miks tuhandene partii tuleb välja järjestatult, mitte segatuna. Versioon 1 kombineerib ajatempli juhusliku sõlme identifikaatoriga, millel on multicast-bitt määratud, nii et see ei kanna kunagi sinu võrgukaardi aadressi, nagu seda tegid algsed 1990ndate aastate rakendused. Versioonid 3 ja 5 ei ole üldse juhuslikud: nad räsivad (hash) nimeruumi koos nimega, kasutades vastavalt MD5 ja SHA-1 algoritme, ning see räsimine toimub samuti sinu seadmes. Ühtegi andmeosa ei saadeta serverisse, midagi ei logita ja kui leht on laetud, jätkab see töötamist ka ilma võrguühenduseta.
«Versioon» on väli, mis otsustab kõik muu. Versioon 4 on 122 juhuslikku bitti ilma struktuurita — see on vaikimisi valik ja õige vastus, kui identifikaator peab olema lihtsalt unikaalne. Versioon 7 säilitab 62 juhuslikku bitti, kuid algab selle loomise ajaga, nii et nende kogum sorteerub vastavalt loomise järjekorrale; see teeb sellest õige versiooni, kui identifikaatorist saab andmebaasi võti. Versioon 1 on algne ajapõhine skeem, mida hoitakse siin süsteemide jaoks, mis seda endiselt nõuavad. Versioonid 3 ja 5 on omamoodi paar: nad on deterministlikud, mis tähendab, et samad sisendid toodavad alati sama identifikaatori, ning nad nõuavad kahte lisavälja — «Nimeruum», mis on üks standardsetest (DNS, URL, OID ja X.500) või sinu enda «Kohandatud nimeruum (UUID)», ja «Nimi», string, mida identifitseeritakse. Anna v5 jaoks URL-i nimeruum ja https://example.com/a ning saad sama UUID täna, homme ja kellegi teise masinas. Just seetõttu kaob väli «Arv», kui valid v3 või v5: tuhat koopiat ühest deterministlikust väärtusest oleksid lihtsalt tuhat koopiat ühest ja samast deterministlikust väärtusest. Kõigi teiste versioonide puhul on «Arv» vahemikus 1 kuni 1000.
Neli lülitit muudavad väljundi kuju ilma selle all olevat 128 bitti muutmata. «Suurtähed» prindib heksadetsimaalsed numbrid versaalidega, «Ilma sidekriipsudeta» annab kompaktse 32-tähemärgilise kuju, mida mõned veerud ja failinimed eelistavad, ning «Loogsulud» mähib väärtuse { } vahele — kuju, mida Windows ja .NET maailm kutsuvad GUID-ks. «Täpsemad valikud» all lisab urn:uuid: eesliite, mis muudab selle ametlikuks URN-iks; sisselülitatuna lülitab see «Loogsulud» ja «Ilma sidekriipsudeta» välja, sest standard lubab täpselt ühte URN-i vormi ja see on kanooniline sidekriipsudega vorm. «Kopeerimise vorming» otsustab, kuidas partii ühendatakse, kui sa selle võtad: üks igale reale, komadega eraldatud või iga väärtus jutumärkides koos lõppeva komaga, mis kleebitakse otse koodi massiivi. Tulemuse all on rida, mis teatab juhuslikkusest bittides — 122 v4 puhul, 62 v7 puhul — ja v7 korral näitab esimesse partii identifikaatorisse kodeeritud ajatemplit, nii et aeg väärtuse sees on nähtav, mitte ainult eeldatav. «Kopeeri kõik» ja «Salvesta faili» arvestavad mõlemad «Kopeerimise vorming» seadet. «Ajalugu» hoiab sinu viimast 10 partiid sinu enda brauseris: klõpsa ühele, et see tagasi tuua, kopeeri või kustuta üksik kirje või puhasta kõik. «Tühjenda» teeb tulemuse tühjaks, kuid jätab sinu seaded rahule, ning pärast 50 identifikaatorit muutub loend üheks keritavaks plokiks viiekümne rea asemel.
Selle lehe kõige olulisem asi on v4 ja v7 erinevus esmase võtmena (primary key), ja see pole maitse küsimus. Andmebaasi indeksid on puud (B-tree), mida hoitakse sorteeritud järjekorras, ning see, kuhu uus võti selles järjekorras satub, otsustab sisestamise töömahu. v4 võti on juhuslik, mistõttu järjestikused sisestused satuvad indeksi omavahel sidumata nurkadesse: täis leheküljed poolitatakse (page split), need puu osad, mida andmebaas mälus hoiab, on harva need osad, mida järgmine sisestus vajab, ja indeks kasvab suuremaks ja killustunumaks, kui read, millele see viitab, õigustaksid. v7 võti algab praeguse millisekundiga, nii et järjestikused sisestused satuvad üksteise kõrvale puu parempoolsesse serva, mis on muster, mida genereerib automaatselt suurenev täisarv ja mille ümber indeksistruktuurid ehitati. See on kogu kompromiss: v7 annab sulle järjestikuse võtme sisestuskäitumise, säilitades samal ajal omaduse, mille pärast sa üldse UUID-d valisid, ehk et igaüks saab seda luua ilma serverilt küsimata. See maksab aga selle, et loomise aeg on nüüd identifikaatori sees loetav, ja kas see loeb, on küsimus sinu andmete, mitte vormingu kohta.
Miski ei kontrolli kunagi UUID unikaalsust; selle suurus on garantii. Puudub register, puudub serveripäring, puudub otsing — generaator toodab numbri ja annab selle üle ning põhjus, miks kaks neist ei kattu, on lihtsalt selles, et võimalikke v4 väärtusi on 2^122, ehk umbes 5,3 sekstiljonit. Sünnipäeva probleem (birthday problem) on aus viis selle mõistmiseks: sul läheks vaja umbes 2,7 triljonit identifikaatorit, enne kui tekib 50-protsendiline võimalus kahe väärtuse kattumiseks, mis teeb miljard uut UUID-d iga sekund 86 aasta jooksul. On oluline olla täpne selles, mida see lubab ja mida mitte. See on statistiline garantii, mitte aritmeetiline, ja see kehtib ainult siis, kui selle aluseks olev juhuslikkus on reaalne — halvasti algväärtustatud generaator või virtuaalmasin, mida kloonitakse koos selle entroopia basseiniga, rikub seda viisil, mida vorming ei suuda tuvastada. Versioon 7 kitsendab küsimust veelgi: ühe millisekundi sees ei saa generaator ennast üldse korrata, sest loendur kasvab, mitte ei viska täringut, ja sõltumatute generaatorite vahel teevad töö ära 62 juhuslikku bitti.
UUID on identifikaator, mitte parool. Versioon 4 on ettearvamatu ja see meelitab inimesi käsitlema seda saladusena — parooli lähtestamise lingi, äraarvamatu URL-ina, sessiooni tokenina, API võtmena. Ettearvamatus on tõeline, kuid saladus on väärtuse käitlemise omadus, ja identifikaatoreid käsitletakse tahtlikult hooletult: nad istuvad URL-ides, mis satuvad brauseri ajalukku, serveri logidesse, referrer-päistesse ja analüütikasse, ning neid kleebitakse vestlussõnumitesse. Teised versioonid on veelgi halvemad kandidaadid. Versioon 1 ja versioon 7 kodeerivad mõlemad loomise hetke, nii et igaüks, kellel on selline UUID, teab umbes, millal see tehti, ja saab kitsendada kõigi sellega koos tehtud asjade naabrust. Versioonid 3 ja 5 on tahtlikult deterministlikud: e-posti aadressi v5 UUID ei ole räsitud saladus, see on väärtus, mida igaüks sama aadressiga saab arvutada ühe sekundi jooksul. Kasuta UUID-d asja nimetamiseks. Kasuta parooligeneraatorit või saladuste jaoks mõeldud raamatukogu tokenit, kui väärtus peab jääma teadmatuks.
Miks valida see UUID generaator?
- Generatsioon ainult brauseris: identifikaatorid luuakse sinu seadmes ja neid ei saadeta kunagi kuhugi
- Web Crypto API juhuslikkus: krüptograafiliselt turvaline, mitte Math.random()
- Viis versiooni ühes kohas: v1, v3, v4, v5 ja v7, ilma tööriistu vahetamata
- Tõeliselt järjestatud v7: loendur millisekundi sees, nagu RFC 9562 kirjeldab
- Deterministlikud v3 ja v5 nelja standardse nimeruumiga või sinu endaga
- Kuni 1000 korraga, kompaktse keritava loendiga pärast viitekümmet
- Iga levinud kuju: sidekriipsudega, paljas, suurtähtedega, loogsulgudes või urn:uuid: URN
- Kopeeri ridadena, komadega või jutumärkides väärtustena, mis kleepuvad otse koodi
- Piiramatu ja tasuta: pole registreerimist, pole kasutuspiiranguid, meie serverites pole midagi
UUID-d ilmuvad igal pool, kus midagi tuleb nimetada, enne kui miski suudab kinnitada, et nimi on vaba. Rakenduse kood loob neid ridadele, mida ta hakkab sisestama, nii et objektil on identiteet enne, kui see on andmebaasi jõudnud, ja klient saab sellele viidata, kuni kirjutamine veel kestab. Hajutatud süsteemid toetuvad neile tugevamalt: mitu teenust, mis kirjutavad ühte tabelisse, võrguühenduseta mobiilne klient lennukis, järjekord, mis peab tuvastama juba töödeldud sõnumi — ükski neist ei saa oodata oma korda ühise loenduri jaoks. Versioon 5 katab teistsugust vajadust, milleks on stabiilne identifikaator, mis tuleneb millestki, mis sul juba on: sama dokument, sama URL või sama konto kaardistub alati samale UUID-le, seega saab importimist käivitada kaks korda, ilma midagi dubleerimata. Mujal on nad lihtsalt vorming, mida süsteem nõuab — e-riigi andmevahetuskiht (nagu X-tee) sündmuste tuvastamiseks, pank Tallinnas, mis koondab kliendiandmeid logidest, telekommunikatsiooniettevõte, mis jälitab kõnesid, testandmestik, mis peab välja nägema nagu päris andmed.
Tasub teada mõningaid ausaid piire. Üks partii on üks versioon: väärtus «Versioon» kehtib kõigele selles partis, nii et rida v4-sid ja rida v7-sid on kaks partiid. See on generaator, mitte inspektor — UUID kleepimine, et lugeda selle versiooni või ajatemplit, ei ole midagi, mida see leht teeb. «Salvesta faili» kirjutab tavalise tekstifaili, mitte CSV või JSON. Versioon 7 avalikustab avatult, millal see loodi, kuni millisekundini, mis on tegelik kompromiss, mitte viga, ning versioon 1 lekitab aega samal viisil; kui see on sinu andmete jaoks probleem, siis versioon 4 on versioon, mis ei ütle kellelegi midagi. Kaks standardi eriväärtust ei ole versioonid ja seetõttu pole need valikud väljal «Versioon», kuid saad neid siit kopeerida: nil UUID, 00000000-0000-0000-0000-000000000000, ja max UUID, ffffffff-ffff-ffff-ffff-ffffffffffff. Kõik sellel lehel järgib RFC 9562, spetsifikatsiooni, mis asendas RFC 4122 2024. aastal, nii et väljund on aktsepteeritud iga raamatukogu, andmebaasi või API poolt, mis UUID-dega üldse tegeleb. Nende piiride sees on garantii tugev: iga identifikaator on ehitatud standardi kohaselt, krüptograafiliselt turvalisest juhuslikkusest, sinu enda masinas, ja keegi teine ei näe seda kunagi.