UUID generatorius

Generuokite UUID naršyklėje: visiškai atsitiktinius v4, laiku išdėstytus v7 arba deterministinius v5. Iki 1000 vienu metu, ir niekas nepalieka jūsų įrenginio.

Paspauskite Generuoti, kad ištrauktumėte
Versija
Išplėstinės parinktys

Reikia identifikatoriaus, kuris nesusidurtų su kieno nors kito sukurtu identifikatoriumi kompiuteryje, apie kurį niekada negirdėjote, ir nereikėtų niekieno prašyti leidimo? Būtent tai ir daro UUID. Tai yra 128 bitų skaičius, užrašomas 36 simboliais pagal įprastą 8-4-4-4-12 modelį, o visa jo struktūra sukurta taip, kad du tokie skaičiai niekada nebūtų vienodi, net jei niekas nekoordinuoja, kas kokį gauna. Šis nemokamas generatorius kuria juos jūsų naršyklėje: pasirinkite versiją skiltyje „Versija“, nurodykite, kiek jų reikia skiltyje „Kiekis“, ir paspauskite „Generuoti“. Puslapis atidaromas su vienu v4 – versija, kurios reikia daugumai projektų, todėl pirmasis identifikatorius pasiekiamas vienu paspaudimu.

Kiekvieną identifikatorių jūsų naršyklė sukuria naudodama Web Crypto API. 4 versija naudoja crypto.randomUUID(), kur naršyklė jį palaiko, arba crypto.getRandomValues() kitais atvejais – tai kriptografiškai stiprus atsitiktinumo šaltinis, o ne JavaScript pseudoatsitiktinė funkcija, tokia kaip Math.random(). 7 versija priekyje prideda 48 bitų milisekundžių tikslumo laiko žymą, tada 12 bitų skaitliuką, kuris didėja tos pačios milisekundės ribose, ir 62 atsitiktinius bitus – tai RFC 9562 aprašytas rikiavimo metodas; dėl šio skaitliuko tūkstančio identifikatorių partija pateikiama išrikiuota, o ne sumaišyta. 1 versija sujungia laiko žymą su atsitiktiniu mazgo identifikatoriumi, kurio daugiastovės (multicast) bitas yra nustatytas, todėl jis niekada neperduoda jūsų tinklo plokštės adreso, kaip tai darė pradinės praėjusio amžiaus 10-ojo dešimtmečio realizacijos. 3 ir 5 versijos visiškai nėra atsitiktinės: jos maišo vardų sritį kartu su pavadinimu, atitinkamai naudodamos MD5 ir SHA-1, ir šis maišymas taip pat atliekamas jūsų įrenginyje. Niekas nesiunčiama į serverį, niekas neregistruojama, o puslapiui užsikrovus jis toliau veikia ir be interneto ryšio.

„Versija“ yra laukas, kuris nulemia visa kita. 4 versija yra 122 atsitiktiniai bitai be jokios struktūros – tai numatytasis pasirinkimas ir teisingas atsakymas, kai identifikatorius tiesiog turi būti unikalus. 7 versija išlaiko 62 atsitiktinius bitus, bet prasideda nuo jos sukūrimo laiko, todėl jų rinkinys išrikiuojamas pagal sukūrimo laiką; būtent dėl to šią versiją verta rinktis, kai identifikatorius taps duomenų bazės raktu. 1 versija yra pradinė laiku pagrįsta schema, palikta čia dėl sistemų, kurios jos vis dar reikalauja. 3 ir 5 versijos yra neįprasta pora: jos yra deterministinės, o tai reiškia, kad tie patys įvesties duomenys visada sugeneruoja tą patį identifikatorių, ir joms reikia dviejų papildomų laukų – „Vardų sritis“, kuri yra viena iš standartinių erdvių DNS, URL, OID ir X.500 arba jūsų sukurta „Pasirinktinis“ („Pasirinktinė vardų sritis (UUID)“), ir „Pavadinimas“, t. y. identifikuojama eilutė. Paduokite v5 URL vardų sritį ir https://example.com/a, ir gausite tą patį UUID šiandien, rytoj ir kito žmogaus kompiuteryje. Dėl šios priežasties „Kiekis“ dingsta, kai pasirenkama v3 arba v5: tūkstantis vieno deterministinio dydžio kopijų būtų tiesiog tūkstantis to paties dydžio kopijų. Visoms kitoms versijoms „Kiekis“ gali būti nuo 1 iki 1000.

Keturi jungikliai keičia išvesties formą, nepakeisdami po ja esančių 128 bitų. „Didžiosios raidės“ atspausdina šešioliktainius skaitmenis versalėmis, „Be brūkšnelių“ pateikia kompaktišką 32 simbolių formą, kuriai pirmenybę teikia kai kurie stulpeliai ir failų pavadinimai, o „Riestiniai skliaustai“ apgaubia reikšmę { } ženklais – formą, kurią Windows ir .NET pasaulis vadina GUID. Skiltyje „Išplėstinės parinktys“ esantis urn:uuid: prideda prefiksą, kuris paverčia jį formaliu URN; jį įjungus, išjungiami „Riestiniai skliaustai“ ir „Be brūkšnelių“, nes standartas leidžia lygiai vieną URN formą, ir ji yra kanoninė su brūkšneliais. „Kopijavimo formatas“ nusprendžia, kaip partija sujungiama ją paimant: po vieną eilutėje, atskirta kableliais arba kiekviena reikšmė kabutėse su kableliu pabaigoje, kas leidžia tiesiogiai įklijuoti į masyvą kode. Po rezultatu yra eilutė, nurodanti atsitiktinumą bitais – 122 v4 versijai, 62 v7 versijai – ir, v7 atveju, laiko žymą, užkoduotą pirmajame partijos identifikatoriuje, todėl laikas reikšmės viduje yra matomas, o ne numanomas. Tiek „Kopijuoti viską“, tiek „Išsaugoti į failą“ atsižvelgia į „Kopijavimo formatas“. „Istorija“ saugo paskutines 10 partijų jūsų naršyklėje: paspauskite vieną, kad ją grąžintumėte, nukopijuokite arba ištrinkite pavienį įrašą, arba išvalykite viską. „Išvalyti“ ištuština rezultatą ir palieka jūsų nustatymus ramybėje, o viršijus 50 identifikatorių, sąrašas tampa vienu slenkamu bloku vietoje penkiasdešimties eilučių.

Svarbiausias dalykas šiame puslapyje yra skirtumas tarp v4 ir v7 kaip pirminio rakto, ir tai nėra skonio reikalas. Duomenų bazių indeksai yra medžiai, laikomi surikiuota tvarka, o tai, kurioje vietoje naujas raktas atsiduria toje tvarkoje, nulemia, kiek darbo kainuos jo įterpimas. v4 raktas yra atsitiktinis, todėl vienas po kito einantys įterpimai patenka į nesusijusius indekso kampus: anksčiau buvę pilni puslapiai padalinami, medžio dalys, kurias duomenų bazė laiko atmintyje, retai yra tos, kurių reikia kitam įterpimui, ir indeksas tampa didesnis ir labiau fragmentuotas, nei pateisina eilutės, į kurias jis rodo. v7 raktas prasideda dabartine milisekunde, todėl vienas po kito einantys įterpimai atsiduria vienas šalia kito dešiniajame medžio krašte – toks yra automatiškai didėjančio sveikojo skaičiaus modelis ir aplink jį buvo kuriamos indeksų struktūros. Tai ir yra esmė: v7 suteikia nuoseklaus rakto įterpimo elgseną, išlaikant savybę, dėl kurios pirmiausia ir pasirinkote UUID – kad bet kas gali jį sukurti neprašydamas serverio. Tai kainuoja tuo, kad sukūrimo laikas tampa įskaitomas identifikatoriaus viduje, o ar tai svarbu, priklauso nuo jūsų duomenų, bet ne nuo formato.

Niekas niekada netikrina UUID unikalumo; jo dydis yra garantija. Nėra jokio registro, jokios užklausos serveriui, jokios paieškos – generatorius sukuria skaičių ir jį atiduoda, o priežastis, dėl kurios du iš jų nesusiduria, yra tiesiog ta, kad yra 2^122 galimų 4 versijos reikšmių, maždaug 5,3 sekstilijono. Gimtadienio paradoksas yra sąžiningas būdas tai įvertinti: prireiktų maždaug 2,7 trilijono identifikatorių, kol atsirastų lygi tikimybė, kad bet kurie du iš jų sutaps, o tai yra milijardas naujų UUID kas sekundę 86 metus. Verta tiksliai apibrėžti, ką tai žada, o ko ne. Tai statistinė, o ne aritmetinė garantija, ir ji galioja tik tol, kol atsitiktinumas po ja yra tikras – prastai inicijuotas generatorius arba virtuali mašina, nuklonuota kartu su savo entropijos fondu, sugriauna šią garantiją taip, kad formatas to negali aptikti. 7 versija šį klausimą dar labiau susiaurina: per vieną milisekundę tas pats generatorius visiškai negali pasikartoti, nes skaitliukas didėja, o ne meta kauliukus, ir tarp nepriklausomų generatorių 62 atsitiktiniai bitai atlieka visą darbą.

UUID yra identifikatorius, o ne slaptažodis. 4 versija yra nenuspėjama, ir tai gundo žmones elgtis su ja kaip su paslaptimi – slaptažodžio keitimo nuoroda, neatspėjamu URL, sesijos žetonu, API raktu. Nenuspėjamumas yra realus, tačiau slaptumas priklauso nuo to, kaip tvarkoma reikšmė, o identifikatoriai pagal savo prigimtį tvarkomi nerūpestingai: jie atsiduria URL adresuose, kurie patenka į naršyklių istoriją, serverių žurnalus, referer antraštes ir analitiką, taip pat yra įklijuojami į pokalbių pranešimus. Kitos versijos yra dar prastesni kandidatai. Ir 1, ir 7 versijos užkoduoja sukūrimo momentą, todėl bet kas, turintis bent vieną iš jų, apytiksliai žino, kada jis buvo sukurtas, ir gali susiaurinti visko, kas sukurta kartu, aplinką. 3 ir 5 versijos yra deterministinės tyčia: v5 UUID iš el. pašto adreso nėra maišyta paslaptis, tai reikšmė, kurią bet kas, turintis tą patį adresą, gali apskaičiuoti per sekundę. Naudokite UUID daiktui pavadinti. Kai reikšmė turi likti nežinoma, naudokite slaptažodžių generatorių arba žetoną iš bibliotekos, skirtos paslaptims.

Kodėl verta rinktis šį UUID generatorių?

UUID atsiranda visur, kur reikia ką nors pavadinti dar prieš tai, kai kas nors gali patvirtinti, jog pavadinimas yra laisvas. Taikomosios programos kodas juos sukuria eilutėms, kurias ruošiasi įterpti, todėl objektas turi tapatybę dar prieš pasiekdamas duomenų bazę, o klientas gali į jį nurodyti, kol įrašymas dar vyksta. Paskirstytosios sistemos jais kliaunasi dar labiau: kelios paslaugos, rašančios į vieną lentelę, neprisijungęs mobilusis klientas, kuriantis įrašus lėktuve, eilė, turinti atpažinti jau apdorotą pranešimą – nė vienas iš jų negali laukti savo eilės prie bendro skaitliuko. 5 versija patenkina kitą poreikį – tai stabilus identifikatorius, išvestas iš to, ką jau turite: tas pats dokumentas, tas pats URL arba ta pati paskyra visada susieta su tuo pačiu UUID, todėl importavimą galima paleisti du kartus nieko nedubliuojant. Kitur jie tiesiog yra sistemai reikalingas formatas – koreliacijos identifikatorius, pravedamas per žurnalus ir sekimus, failo pavadinimas, kuris nesusidurs, kai tūkstančio vartotojų įkėlimai atsidurs viename saugyklos kauše (bucket), Windows registro raktas, bandomųjų duomenų rinkinys, kuris turi atrodyti kaip tikri duomenys.

Verta žinoti kelis sąžiningus apribojimus. Viena partija yra viena versija: „Versija“ nurodyta reikšmė taikoma viskam, kas joje yra, todėl v4 ir v7 paleidimai yra dvi partijos. Tai generatorius, o ne inspektorius – šis puslapis neatlieka tokios funkcijos kaip UUID įklijavimas, siekiant nuskaityti jo versiją ar laiko žymą. „Išsaugoti į failą“ įrašo paprastą tekstinį failą, o ne CSV ar JSON. 7 versija atvirai parodo, kada ji buvo sukurta, iki milisekundės tikslumu, o tai yra realus kompromisas, o ne trūkumas, ir 1 versija taip pat atskleidžia laiką; jei tai kelia problemų jūsų duomenims, 4 versija yra toji, kuri niekam nieko nesako. Dvi specialios standarto reikšmės nėra versijos, todėl jų nėra prie „Versija“ parinkčių, bet galite jas nukopijuoti iš čia: nil UUID, 00000000-0000-0000-0000-000000000000, ir max UUID, ffffffff-ffff-ffff-ffff-ffffffffffff. Viskas šiame puslapyje atitinka RFC 9562 – specifikaciją, kuri 2024 m. pakeitė RFC 4122, todėl išvestį priima bet kuri biblioteka, duomenų bazė ar API, apskritai palaikanti UUID. Šiose ribose garantija yra stipri: kiekvienas identifikatorius sukonstruotas pagal standartą, iš kriptografiškai saugaus atsitiktinumo, jūsų pačių kompiuteryje, ir niekas kitas jo niekada nemato.

FAQ

Kaip sugeneruoti UUID?

Pasirinkite versiją skiltyje „Versija“, nustatykite reikiamą kiekį skiltyje „Kiekis“ ir paspauskite „Generuoti“. Puslapis atidaromas su vienu 4 versijos identifikatoriumi, kurio reikia daugumai projektų, todėl paprastas UUID pasiekiamas vienu paspaudimu. Kiekviena reikšmė rodoma su savo kopijavimo mygtuku, o „Kopijuoti viską“ paima visą partiją iš karto.

Koks skirtumas tarp UUID v4 ir v7?

4 versija yra 122 atsitiktiniai bitai be jokios struktūros, todėl du tokie bitai neturi jokio ryšio vienas su kitu. 7 versija pirmuosius 48 bitus skiria milisekundei, kurią ji buvo sukurta, prideda skaitliuką ir 62 atsitiktinius bitus, todėl ji yra rikiuojama: partija išeina tokia tvarka, kokia buvo sukurta. Naudokite v4, kai identifikatorius tiesiog turi būti unikalus, ir v7, kai jis taip pat bus duomenų bazės raktas.

Kurią UUID versiją turėčiau naudoti?

4 versiją, nebent turite priežastį pasirinkti kitą. Pasirinkite 7 versiją, jei identifikatorius taps pirminiu raktu ir įterpimo našumas yra svarbus, 5 versiją, jei reikia, kad tie patys įvesties duomenys visada sugeneruotų tą patį identifikatorių, ir 1 versiją tik tuo atveju, jei sistema, su kuria turite bendrauti, to specifiškai reikalauja. 3 versija yra ta pati 5 versija su MD5 vietoje SHA-1 ir egzistuoja dėl suderinamumo.

Ar sugeneruoti UUID tikrai yra atsitiktiniai ir saugūs?

Atsitiktinumas yra kriptografiškai saugus: jis gaunamas iš jūsų naršyklės Web Crypto API per crypto.randomUUID() arba crypto.getRandomValues(), o ne iš Math.random(). Saugumas neatspėjamumo prasme yra kitas klausimas nei saugumas slaptumo prasme – UUID yra identifikatorius, todėl jo nereikėtų naudoti kaip slaptažodžio, sesijos žetono ar API rakto.

Ar galiu sugeneruoti daug UUID vienu metu?

Taip, iki 1000 vienu metu. Nustatykite „Kiekis“ ir paspauskite „Generuoti“; viršijus penkiasdešimt reikšmių, rezultatas tampa vienu slenkamu bloku, o ne ilgu eilučių sąrašu. „Kopijuoti viską“ ir „Išsaugoti į failą“ paima visą partiją, sujungtą taip, kaip nurodo „Kopijavimo formatas“ – po vieną eilutėje, atskirta kableliais arba kabutėse, kad būtų galima tiesiogiai įklijuoti į masyvą.

Kodėl v3 ir v5 man kaskart duoda tą patį UUID?

Nes tam jie ir skirti. 3 ir 5 versijos yra deterministinės: jos atlieka maišą iš jūsų pateiktos vardų srities ir pavadinimo, todėl identiški įvesties duomenys visada sukuria identišką identifikatorių bet kuriame kompiuteryje ir bet kuria programavimo kalba. Tai daro jas naudingas norint išvesti stabilų identifikatorių iš to, ką jau turite, ir dėl to „Kiekis“ yra paslėptas, kai jas pasirenkate.

Kas yra Vardų sritis ir Pavadinimas, ir kokią vardų sritį turėčiau pasirinkti?

Tai yra du įvesties duomenys, iš kurių apskaičiuojamas 3 arba 5 versijos UUID. „Vardų sritis“ nurodo, koks objektas yra pavadinimas – DNS, skirtas prieglobų vardams, URL, skirtas adresams, OID ir X.500 šioms katalogų schemoms, arba „Pasirinktinis“ („Pasirinktinė vardų sritis (UUID)“), jei norite pateikti savo paties vardų srities UUID, o tai yra įprastas pasirinkimas taikomosios programos viduje. „Pavadinimas“ yra pati eilutė. Skirtingos vardų sritys duoda visiškai skirtingus rezultatus tam pačiam pavadinimui, būtent todėl jos ir egzistuoja.

Kodėl UUID v7 duomenų bazės pirminiam raktui tinka geriau nei v4?

Dėl vietos, kurioje reikšmės atsiduria indekse. Indeksas laikomas surikiuota tvarka, o atsitiktinis v4 raktas jame patenka bet kur, todėl įterpimai padalija puslapius visame medyje ir atmintyje laikomos dalys retai būna tos, kurių prireiks vėliau. v7 raktas prasideda dabartine milisekunde, todėl vienas po kito einantys įterpimai atsiduria kartu indekso pabaigoje – taip, kaip elgiasi nuoseklus sveikojo skaičiaus raktas, tuo pačiu leidžiant bet kuriai paslaugai sukurti identifikatorių neprašant centrinio skaitliuko.

Ar du UUID kada nors galėtų būti vienodi?

Iš esmės taip, praktiškai ne, ir verta žinoti, kaip yra. Niekas netikrina unikalumo: tiesiog yra 2^122 galimų 4 versijos reikšmių, maždaug 5,3 sekstilijono, ir jums prireiktų maždaug 2,7 trilijono identifikatorių – milijardo kas sekundę 86 metus – kol atsirastų lygi tikimybė pavieniam susidūrimui. Garantija yra statistinė, o ne absoliuti, ir ji priklauso nuo to, ar atsitiktinumas yra tikras, dėl to šis generatorius naudoja Web Crypto API, o ne paprastą pseudoatsitiktinę funkciją.

Ar galiu naudoti UUID kaip slaptažodį, API raktą ar sesijos žetoną?

Ne, ir tai yra daugiausiai kainuojanti klaida. 4 versijos UUID yra nenuspėjamas, tačiau identifikatoriai traktuojami kaip vieši: jie atsiduria URL, naršyklės istorijoje, serverių žurnaluose, referer antraštėse ir analitikoje. 1 ir 7 versijos papildomai atskleidžia, kada jos buvo sukurtos, o 3 ir 5 versijas gali perskaičiuoti bet kas, žinantis įvesties duomenis. Bet kam, kas turi likti paslaptyje, naudokite slaptažodžių generatorių arba žetoną iš paslaptims skirtos bibliotekos.

Ar UUID v7 atskleidžia, kada jis buvo sukurtas?

Taip, milisekundės tikslumu, ir tai yra numatyta dizaine, o ne klaida – laiko žyma yra tai, kas daro v7 rikiuojamą. Po rezultatu esanti eilutė rodo jums laiką, užkoduotą pirmojoje partijos reikšmėje, kad galėtumėte tiksliai matyti, kas atskleidžiama. 1 versija taip pat turi laiko žymą. Jei sukūrimo laikas yra kažkas, ko verčiau nenorėtumėte skelbti, 4 versija niekam nieko nesako.

Ar UUID v1 atskleidžia mano MAC adresą?

Ne čia. Pradinėje schemoje kaip mazgo laukas buvo naudojamas kompiuterio tinklo plokštės adresas – iš čia ir kilusi v1 reputacija, tačiau standartas taip pat leidžia atsitiktinį mazgo identifikatorių, pažymėtą daugiastovės (multicast) bitu, ir būtent tai sukuria šis generatorius. Jūsų aparatinės įrangos adresas niekada nenuskaitomas ir niekada neatsiranda išvestyje.

Ką keičia Didžiosios raidės, Be brūkšnelių, Riestiniai skliaustai ir urn:uuid:?

Tik pateikimą – 128 bitai po juo yra identiški kiekvienoje formoje. „Didžiosios raidės“ atspausdina šešioliktainius skaitmenis versalėmis, „Be brūkšnelių“ pateikia kompaktišką 32 simbolių versiją, „Riestiniai skliaustai“ apgaubia reikšmę { } ženklais taip, kaip Windows ir .NET rašo GUID, o urn:uuid: prideda prefiksą, paverčiantį jį formaliu URN. Įjungtas urn:uuid: išjungia kitus du, nes standartas apibrėžia lygiai vieną URN formą, ir ji yra kanoninė forma su brūkšneliais.