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ų?
- Generavimas tik naršyklėje: identifikatoriai kuriami jūsų įrenginyje ir niekada niekur nesiunčiami
- Web Crypto API atsitiktinumas: kriptografiškai saugus, o ne Math.random()
- Penkios versijos vienoje vietoje: v1, v3, v4, v5 ir v7, nekeičiant įrankių
- Tikrai surikiuota v7: skaitliukas milisekundės viduje, kaip aprašo RFC 9562
- Deterministinės v3 ir v5 su keturiomis standartinėmis vardų sritimis arba jūsų pačių
- Iki 1000 vienu metu, su kompaktišku slenkamu sąrašu viršijus penkiasdešimt
- Visos įprastos formos: su brūkšneliais, be jų, didžiosiomis raidėmis, su riestiniais skliaustais arba urn:uuid: URN
- Kopijuokite kaip eilutes, su kableliais arba kaip kabutėse esančias reikšmes, kurios tiesiogiai įklijuojamos į kodą
- Neribotas ir nemokamas: jokios registracijos, jokių naudojimo apribojimų, nieko mūsų serveriuose
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.