Vai nepieciešams identifikators, kas nesakritīs ar cita izveidotu identifikatoru datorā, par kuru nekad neesat dzirdējis, un nevienam neprasot atļauju? Tieši to dara UUID. Tas ir 128 bitu skaitlis, kas tiek rakstīts kā 36 rakstzīmes parastajā 8-4-4-4-12 formātā, un tā pamatā ir tas, ka divi šādi skaitļi nekad nebūs vienādi, pat ja nekas nekoordinē to sadali. Šis bezmaksas ģenerators izveido tos jūsu pārlūkprogrammā: izvēlieties versiju laukā „Versija”, norādiet vajadzīgo daudzumu laukā „Skaits” un nospiediet „Ģenerēt”. Lapa tiek atvērta ar vienu v4 identifikatoru, kas ir lielākajai daļai projektu nepieciešamā versija, tāpēc pirmais identifikators ir pieejams ar vienu klikšķi.
Katra identifikatora izveidi nodrošina jūsu pārlūkprogramma, izmantojot Web Crypto API. 4. versijai (v4) tiek izmantots crypto.randomUUID(), ja pārlūkprogramma to atbalsta, vai crypto.getRandomValues() pretējā gadījumā – kriptogrāfiski drošs nejaušības avots, nevis JavaScript pseidonejaušā funkcija, piemēram, Math.random(). 7. versija (v7) sākumā iekļauj 48 bitu laikspiedolu ar milisekunžu precizitāti, kam seko 12 bitu skaitītājs, kas palielinās vienas milisekundes ietvaros, un 62 nejauši biti – šī ir RFC 9562 aprakstītā kārtošanas metode; pateicoties šim skaitītājam, tūkstoš identifikatoru partija tiek ģenerēta secīgi, nevis sajauktā secībā. 1. versija (v1) apvieno laikspiedolu ar nejaušu mezgla identifikatoru, kuram ir iestatīts multiraides bits, tāpēc tā nekad nesatur jūsu tīkla kartes adresi, kā to darīja sākotnējās 1990. gadu realizācijas. 3. un 5. versija (v3 un v5) vispār nav nejauša: tā jauc (hash) vārdtelpu kopā ar nosaukumu, izmantojot attiecīgi MD5 un SHA-1, un šī jaukšana arī notiek jūsu ierīcē. Nekas netiek sūtīts uz serveri, nekas netiek reģistrēts, un, tiklīdz lapa ir ielādēta, tā turpina darboties pat bez interneta savienojuma.
„Versija” ir lauks, kas izšķir visu pārējo. 4. versija sastāv no 122 nejaušiem bitiem bez jebkādas struktūras – tā ir noklusējuma izvēle un pareizā atbilde gadījumos, kad identifikatoram vienkārši jābūt unikālam. 7. versija saglabā 62 nejaušus bitus, bet sākas ar tās izveides laiku, tāpēc to kopa tiek sakārtota to izveidošanas secībā; tieši tādēļ šī versija jāizvēlas, kad identifikators kļūs par datubāzes atslēgu. 1. versija ir sākotnējā laikā balstītā shēma, kas šeit saglabāta sistēmām, kuras to joprojām pieprasa. 3. un 5. versija ir neparasts pāris: tās ir deterministiskas, kas nozīmē, ka vieni un tie paši ievades dati vienmēr rada to pašu identifikatoru, un tām nepieciešami divi papildu lauki – „Vārdtelpa”, kas ir viena no standarta telpām DNS, URL, OID un X.500 vai jūsu izveidota pielāgota telpa („Pielāgots”), un „Nosaukums”, kas ir identificējamā virkne. Norādiet v5 identifikatoram URL vārdtelpu un https://example.com/a, un jūs saņemsiet to pašu UUID šodien, rīt un cita lietotāja datorā. Šī iemesla dēļ „Skaits” pazūd, ja izvēlēta v3 vai v5 versija: tūkstoš deterministiskas vērtības kopijas būtu vienkārši tūkstoš kopijas vienai un tai pašai vērtībai. Visām pārējām versijām skaits laukā „Skaits” var būt no 1 līdz 1000.
Četri slēdži maina rezultāta formu, nemainot zem tās esošos 128 bitus. „Lielie burti” attēlo heksadecimālos ciparus ar versāliem, „Bez defisēm” nodrošina kompakto 32 rakstzīmju formu, kurai dod priekšroku noteiktas kolonnas un failu nosaukumi, un „Figūriekavas” iekļauj vērtību starp { } – formā, ko Windows un .NET pasaule dēvē par GUID. Sadaļā „Papildu iestatījumi” esošais urn:uuid: pievieno prefiksu, kas to padara par formālu URN; tā ieslēgšana izslēdz laukus „Figūriekavas” un „Bez defisēm”, jo standarts pieļauj tikai vienu URN formu, un tā ir kanoniskā forma ar defisēm. „Kopēšanas formāts” nosaka, kā partija tiek apvienota tās kopēšanas laikā: pa vienam rindā, atdalīti ar komatiem, vai katra vērtība pēdiņās, kam seko komats, ko var tieši iekopēt koda masīvā. Zem rezultāta ir redzama rinda, kas norāda nejaušību bitos – 122 bitu v4 versijai, 62 bitu v7 versijai – un, v7 gadījumā, partijas pirmajā identifikatorā iekodēto laikspiedolu, lai vērtībā ietvertais laiks būtu redzams, nevis netiešs. Gan „Kopēt visu”, gan „Saglabāt failā” ievēro „Kopēšanas formāts” iestatījumus. „Vēsture” jūsu pārlūkprogrammā saglabā 10 pēdējās partijas: noklikšķiniet uz vienas no tām, lai to atjaunotu, kopējiet vai dzēsiet atsevišķu ierakstu, vai notīriet visu sarakstu. Poga „Notīrīt” iztukšo rezultātu un atstāj jūsu iestatījumus nemainītus, un pēc 50 identifikatoriem saraksts kļūst par vienu ritināmu bloku, nevis piecdesmit rindām.
Visbūtiskākā atšķirība šajā lapā ir starp v4 un v7 kā primāro atslēgu, un tas nav gaumes jautājums. Datubāzu indeksi ir koki, kas tiek uzturēti sakārtotā secībā, un tas, kur jaunā atslēga nonāk šajā secībā, nosaka tās ievietošanas darbietilpību. v4 atslēga ir nejauša, tāpēc secīgi ievietojumi nonāk nesaistītos indeksa stūros: lapas, kas bija pilnas, tiek sadalītas, koka daļas, kuras datubāze glabā atmiņā, reti ir tās, kas nepieciešamas nākamajai ievietošanai, un indekss kļūst lielāks un vairāk fragmentēts, nekā to pamato rindas, uz kurām tas norāda. v7 atslēga sākas ar pašreizējo milisekundi, tāpēc secīgi ievietojumi nonāk blakus viens otram koka labajā malā, kas atbilst automātiski pieaugoša veselā skaitļa modelim, un tas ir modelis, ap kuru tika veidotas indeksu struktūras. Tā ir galvenā kompromisa būtība: v7 sniedz jums secīgas atslēgas ievietošanas uzvedību, vienlaikus saglabājot īpašību, kuras dēļ sākotnēji izvēlējāties UUID — ikviens var izveidot identifikatoru, to neprasot serverim. Par to nākas maksāt ar to, ka izveides laiks identifikatorā tagad ir nolasāms, un tas, vai tam ir nozīme, ir jautājums par jūsu datiem, nevis par formātu.
Nekas nekad nepārbauda UUID unikālumu; tā izmērs ir garantija. Nav nekāda reģistra, nav datu apmaiņas ar serveri, nav meklēšanas – ģenerators izveido skaitļus un tos nodod, un iemesls, kāpēc divi no tiem nesakrīt (neveido sadursmi), ir vienkārši tas, ka ir 2^122 iespējamās v4 vērtības, kas ir aptuveni 5,3 sekstiljoni. Dzimšanas dienas paradokss ir godīgs veids, kā to novērtēt: jums būtu nepieciešami aptuveni 2,7 triljoni identifikatoru, pirms pastāvētu 50% iespēja, ka jebkuri divi no tiem sakrīt, kas nozīmē ģenerēt miljardu jaunu UUID katru sekundi 86 gadus. Ir vērts precīzi apzināties, ko tas sola un ko nē. Tā ir statistiska, nevis aritmētiska garantija, un tā ir spēkā tikai tad, ja pamatā esošā nejaušība ir patiesa – slikti inicializēts ģenerators vai virtuālā mašīna, kas klonēta kopā ar tās entropijas fondu, to sabojā tā, kā formāts to nespēj atklāt. 7. versija šo jautājumu sašaurina vēl vairāk: vienas milisekundes ietvaros ģenerators vispār nespēj atkārtoties, jo skaitītājs palielinās secīgi, nevis metot kauliņus, bet starp neatkarīgiem ģeneratoriem galveno darbu paveic 62 nejaušie biti.
UUID ir identifikators, nevis parole. 4. versija ir neparedzama, un tas vilina cilvēkus to izmantot kā noslēpumu – paroles atiestatīšanas saiti, neuzminamu URL, sesijas pilnvaru (token), API atslēgu. Neparedzamība ir reāla, taču slepenība ir atkarīga no tā, kā vērtība tiek apstrādāta, un identifikatori pēc to būtības tiek apstrādāti neuzmanīgi: tie parādās URL adresēs, kas nonāk pārlūkprogrammu vēsturē, serveru žurnālos, norāžu galvenēs (referer headers) un analītikā, kā arī tiek ielīmēti tērzēšanas ziņojumos. Citas versijas ir vēl sliktāki kandidāti. 1. un 7. versija iekodē tās izveides laiku, tāpēc ikviens, kuram tas ir, zina aptuveno izveides brīdi un var sašaurināt to objektu loku, kas tika izveidoti tajā pašā laikā. 3. un 5. versija apzināti ir deterministiskas: e-pasta adreses v5 UUID nav jaukts noslēpums, tā ir vērtība, ko ikviens ar šo pašu adresi var aprēķināt sekundes laikā. Izmantojiet UUID, lai piešķirtu objektam nosaukumu. Ja vērtībai jāpaliek nezināmai, izmantojiet paroļu ģeneratoru vai noslēpumiem paredzētas bibliotēkas pilnvaru.
Kāpēc izvēlēties šo UUID ģeneratoru?
- Ģenerēšana tikai pārlūkprogrammā: identifikatori tiek izveidoti jūsu ierīcē un nekad netiek nekur nosūtīti
- Web Crypto API nejaušība: kriptogrāfiski drošs avots, nevis Math.random()
- Piecas versijas vienuviet: v1, v3, v4, v5 un v7, nepārslēdzoties starp rīkiem
- Patiesi sakārtots v7: skaitītājs milisekundes ietvaros, kā to apraksta RFC 9562
- Deterministisks v3 un v5 ar četrām standarta vārdtelpām vai jūsu pielāgotu vārdtelpu
- Līdz 1000 vienlaikus, ar kompaktu, ritināmu sarakstu virs piecdesmit ierakstiem
- Jebkura populāra forma: ar defisēm, bez defisēm, ar lielajiem burtiem, figūriekavās vai kā urn:uuid: URN
- Kopēšana kā rindas, atdalīta ar komatiem vai pēdiņās ievietotas vērtības tiešai ielīmēšanai kodā
- Neierobežots un bezmaksas: nav nepieciešama reģistrācija, nav lietošanas ierobežojumu, nekas netiek glabāts mūsu serveros
UUID tiek izmantoti visur, kur nepieciešams kaut kam piešķirt nosaukumu vēl pirms var apstiprināt, ka šis nosaukums ir brīvs. Lietojumprogrammas kods tos izveido rindām, kuras tas grasās ievietot, tāpēc objektam ir identitāte, vēl pirms tas ir sasniedzis datubāzi, un klients uz to var atsaukties pat tad, kad ierakstīšanas process vēl noris. Izkliedētās sistēmas uz tiem paļaujas vēl vairāk: vairāki servisi, kas raksta vienā tabulā, mobilais klients, kas ierakstus veido lidmašīnā (bezsaistē), vai rinda, kurai jāatpazīst ziņojums, kas jau ir apstrādāts – neviena no šīm sistēmām nevar gaidīt savu rindu pie koplietošanas skaitītāja. 5. versija atrisina atšķirīgu vajadzību, kas ir stabils identifikators, kas atvasināts no tā, kas jums jau ir: viens un tas pats dokuments, viens un tas pats URL vai viens un tas pats konts vienmēr atbilst tam pašam UUID, tādēļ datu importu var veikt divreiz, nedublējot nevienu ierakstu. Citur tie vienkārši ir sistēmas pieprasīts formāts – korelācijas identifikators, kas izmantots caur žurnāliem un izsekošanu, faila nosaukums, kas neradīs sadursmes, kad tūkstoš lietotāju augšupielādes nonāks vienā glabātuvē (bucket), Windows reģistra atslēga, vai testa dati, kuriem jāizskatās kā īstiem datiem.
Ir vērts zināt dažus godīgus ierobežojumus. Viena partija atbilst vienai versijai: laukā „Versija” norādītā vērtība attiecas uz visu partiju, tādēļ v4 un v7 ģenerēšana ir divas atsevišķas partijas. Tas ir ģenerators, nevis inspektors – šī lapa nepiedāvā funkciju ievietot UUID, lai nolasītu tā versiju vai laikspiedolu. Poga „Saglabāt failā” ieraksta vienkārša teksta failu, nevis CSV vai JSON. 7. versija atklāti parāda savu izveides laiku līdz pat milisekundei, kas ir reāls kompromiss, nevis trūkums, un 1. versija nopludina laiku tieši tādā pašā veidā; ja jūsu datiem tā ir problēma, 4. versija ir tā, kas nevienam neko neatklāj. Divas īpašas standarta vērtības netiek uzskatītas par versijām, tāpēc tās nav iekļautas „Versija” opcijās, bet jūs tās varat nokopēt no šejienes: nil UUID, 00000000-0000-0000-0000-000000000000, un max UUID, ffffffff-ffff-ffff-ffff-ffffffffffff. Viss šajā lapā atbilst RFC 9562 standartam (specifikācijai, kas 2024. gadā aizstāja RFC 4122), tādēļ izveidoto rezultātu pieņems jebkura bibliotēka, datubāze vai API, kas vispār atbalsta UUID apstrādi. Šajos ietvaros garantija ir stingra: katrs identifikators ir izveidots atbilstoši standartam, iegūts no kriptogrāfiski drošas nejaušības, to izveidojot jūsu pašu datorā, un neviens cits to nekad neredzēs.