UUID generaator

Genereeri UUID-sid oma brauseris: täiesti juhuslik v4, ajaliselt järjestatud v7 andmebaasi võtmete jaoks või deterministlik v5. Kuni 1000 korraga ja midagi ei lahku sinu seadmest.

Vajutage Genereeri, et loosida
Versioon
Täpsemad valikud

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?

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.

FAQ

Kuidas ma genereerin UUID-d?

Vali versioon väljal «Versioon», määra vajalik kogus väljal «Arv» ja vajuta «Genereeri». Leht avaneb ühe versioon 4 identifikaatoriga, mis on enamiku projektide soov, nii et tavaline UUID on vaid ühe klõpsu kaugusel. Iga väärtus ilmub oma kopeerimisnupuga ja «Kopeeri kõik» võtab kogu partii korraga.

Mis on UUID v4 ja v7 erinevus?

Versioon 4 on 122 juhuslikku bitti ilma igasuguse struktuurita, nii et kahel neist pole omavahel mingit seost. Versioon 7 kulutab esimesed 48 bitti loomise millisekundile, lisab loenduri ja 62 juhuslikku bitti, olles seetõttu sorteeritav: partii väljastatakse loomise järjekorras. Kasuta v4, kui identifikaator peab olema lihtsalt unikaalne, ja v7, kui sellest saab ka andmebaasi võti.

Millist UUID versiooni peaksin kasutama?

Versioon 4, välja arvatud juhul, kui sul on põhjust teist valida. Vali versioon 7, kui identifikaatorist saab esmane võti ja sisestuse jõudlus on oluline, versioon 5, kui vajad sama sisendit, et alati toota sama identifikaator, ja versioon 1 ainult siis, kui süsteem, millega pead suhtlema, seda spetsiaalselt nõuab. Versioon 3 on versioon 5, mis kasutab SHA-1 asemel MD5-te, ja on olemas ühilduvuse tagamiseks.

Kas genereeritud UUID-d on tõesti juhuslikud ja turvalised?

Juhuslikkus on krüptograafiliselt turvaline: see pärineb sinu brauseri Web Crypto API-st, läbi crypto.randomUUID() või crypto.getRandomValues(), mitte funktsioonist Math.random(). Turvaline ettearvamatuse mõttes on teine küsimus kui turvaline saladuse mõttes — UUID on identifikaator ning seda ei tohiks kasutada parooli, sessiooni tokeni või API võtmena.

Kas ma saan korraga genereerida palju UUID-sid?

Jah, kuni 1000 korraga. Määra «Arv» ja vajuta «Genereeri»; pärast viitekümmet väärtust muutub tulemus pikast ridade loendist üheks keritavaks plokiks. «Kopeeri kõik» ja «Salvesta faili» võtavad kogu partii, ühendatuna nii, nagu «Kopeerimise vorming» ütleb — üks iga rea kohta, komadega eraldatud või jutumärkides, et kleepida otse massiivi.

Miks annavad v3 ja v5 mulle iga kord sama UUID?

Sest selleks need ongi. Versioonid 3 ja 5 on deterministlikud: nad räsivad nimeruumi ja nime, mille sa neile annad, nii et identsed sisendid toodavad alati identse identifikaatori igas masinas ja igas keeles. See teeb need kasulikuks stabiilse identifikaatori tuletamiseks millestki, mis sul juba on, ja just seetõttu on «Arv» varjatud, kui sa need valid.

Mis on Nimeruum ja Nimi, ning millise nimeruumi peaksin valima?

Need on kaks sisendit, millest versiooni 3 või versiooni 5 UUID arvutatakse. «Nimeruum» ütleb, mis tüüpi asi on nimi — DNS hostinimede jaoks, URL aadresside jaoks, OID ja X.500 nende kataloogiskeemide jaoks, või «Kohandatud nimeruum (UUID)», kui soovid pakkuda omaenda nimeruumi UUID-d, mis on tavaline valik rakenduse sees. «Nimi» on string ise. Erinevad nimeruumid annavad sama nime jaoks täiesti erinevaid tulemusi, mis ongi nende olemasolu mõte.

Miks on UUID v7 parem andmebaasi esmaseks võtmeks kui v4?

Sest see määrab, kuhu väärtused indekseerimisel paigutuvad. Indeksit hoitakse sorteeritud järjekorras ja juhuslik v4 võti paigutub sellesse ükskõik kuhu, mistõttu sisestamised poolitavad lehekülgi üle kogu puu ja mälus hoitavad osad on harva need osad, mida järgmisena vajatakse. v7 võti algab praeguse millisekundiga, nii et järjestikused sisestamised koonduvad indeksi lõppu, mis on järjestikuse täisarvulise võtme käitumisviis — võimaldades samas mis tahes teenusel luua identifikaator ilma keskset loendurit küsimata.

Kas kaks UUID-d võiksid kunagi kattuda?

Põhimõtteliselt jah, praktikas ei, ja tasub teada, kumba. Miski ei kontrolli unikaalsust: versioonil 4 on lihtsalt 2^122 võimalikku väärtust, umbes 5,3 sekstiljonit, ja sul läheks vaja laias laastus 2,7 triljonit — miljard igas sekundis 86 aasta jooksul — enne kui tekiks 50-protsendiline võimalus üheks kokkupõrkeks. Garantii on pigem statistiline kui absoluutne ja see sõltub ehtsast juhuslikkusest, mis on ka põhjus, miks see generaator kasutab pigem Web Crypto API-t kui tavalist pseudo-juhuslikku funktsiooni.

Kas ma võin kasutada UUID-d parooli, API võtme või sessiooni tokenina?

Ei, ja see on viga, mis maksab enim. Versioon 4 UUID on ettearvamatu, kuid identifikaatoreid käsitletakse nagu need oleksid avalikud: nad lõpetavad URL-ides, brauseri ajaloos, serverilogides, referrer-päistes ja analüütikas. Versioonid 1 ja 7 avaldavad lisaks, millal nad loodi, ning versioonid 3 ja 5 on uuesti arvutatavad igaühe poolt, kes teab sisendeid. Igasuguse asja jaoks, mis peab jääma saladuseks, kasuta parooligeneraatorit või tokenit saladuste jaoks mõeldud raamatukogust.

Kas UUID v7 paljastab, millal see loodi?

Jah, millisekundi täpsusega, ja see isegi on taotluslik, mitte möödalaskmine — ajatempel on see, mis teeb v7 sorteeritavaks. Tulemuse all olev rida näitab sulle partii esimesse väärtusesse kodeeritud aega, nii et näed täpselt, mida paljastatakse. Ka versioon 1 kannab ajatemplit. Kui loomise aeg on miski, mida sa pigem ei avaldaks, siis versioon 4 ei sisalda mingit aega.

Kas UUID v1 paljastab minu MAC-aadressi?

Mitte siin. Algne skeem kasutas sõlmeväljana masina võrgukaardi aadressi, kust pärineb v1 maine, kuid standard lubab ka juhuslikku sõlme identifikaatorit, millel on märgitud multicast-bitt, ja just seda toodab see generaator. Sinu riistvara aadressi ei loeta kunagi ja see ei ilmu kunagi väljundis.

Mida muudavad Suurtähed, Ilma sidekriipsudeta, Loogsulud ja urn:uuid:?

Ainult esitlust — all olevad 128 bitti on igas vormis identsed. «Suurtähed» prindib heksadetsimaalnumbrid versaalidena, «Ilma sidekriipsudeta» annab kompaktse 32-tähemärgilise versiooni, «Loogsulud» mähib väärtuse { } vahele viisil, nagu Windows ja .NET GUID-i kirjutavad, ning urn:uuid: lisab eesliite, mis teeb sellest ametliku URN-i. urn:uuid: lülitab teised kaks sisselülitamise ajaks välja, kuna standard määratleb täpselt ühe URN vormi ja see on kanooniline sidekriipsudega variant.