Trebate li identifikator koji se neće sukobiti s nekim drugim koji je netko drugi napravio, na stroju za koji nikada niste čuli, a da nikoga ne pitate za dopuštenje? To je upravo posao koji obavlja UUID. To je 128-bitni broj, napisan kao 36 znakova u dobro poznatom uzorku 8-4-4-4-12, i cijeli njegov dizajn služi tome da dva od njih nikada neće biti ista, iako ništa ne koordinira tko dobiva koji. Ovaj besplatni generator stvara ih u vašem pregledniku: odaberite verziju pod „Verzija”, navedite koliko ih trebate pod „Broj” i pritisnite „Generiraj”. Stranica se otvara s jednim v4, što je verzija koju većina projekata traži, tako da ste od prvog identifikatora udaljeni samo jedan klik.
Svaki identifikator gradi vaš preglednik putem Web Crypto API-ja. Verzija 4 koristi crypto.randomUUID() tamo gdje ga preglednik pruža, a inače crypto.getRandomValues() — kriptografski snažan izvor nasumičnosti umjesto pseudo-nasumične JavaScript funkcije kao što je Math.random(). Verzija 7 na početak stavlja 48-bitnu milisekundnu vremensku oznaku, zatim 12-bitni brojač koji se povećava unutar iste milisekunde, a zatim 62 nasumična bita, što je metoda sortiranja opisana u RFC 9562; taj brojač je razlog zašto serija od tisuću izlazi po redu, a ne izmiješana. Verzija 1 kombinira vremensku oznaku s nasumičnim identifikatorom čvora koji ima postavljen multicast bit, tako da nikada ne nosi adresu vaše mrežne kartice na način na koji su to činile originalne implementacije iz 1990-ih. Verzije 3 i 5 uopće nisu nasumične: one sažimlju imenski prostor zajedno s nazivom koristeći MD5 i SHA-1 respektivno, a to se sažimanje također odvija na vašem uređaju. Ništa se ne šalje na poslužitelj, ništa se ne bilježi, a nakon što se stranica učita, nastavlja raditi i kada ste izvan mreže.
„Verzija” je polje koje odlučuje o svemu ostalom. Verzija 4 je 122 nasumična bita bez ikakve strukture — to je zadana opcija i pravi odgovor kada identifikator mora biti samo jedinstven. Verzija 7 zadržava 62 nasumična bita, ali počinje s vremenom kada je stvorena, tako da se skup njih sortira redoslijedom kojim su napravljeni; zbog toga je to verzija koju treba odabrati kada identifikator postaje ključ baze podataka. Verzija 1 izvorna je vremenski zasnovana shema, zadržana ovdje za sustave koji je i dalje traže. Verzije 3 i 5 neobičan su par: one su determinističke, što znači da isti ulazni podaci uvijek proizvode isti identifikator, i one uzimaju dva dodatna polja — „Imenski prostor”, koji je jedan od standardnih prostora DNS, URL, OID i X.500 ili vaš vlastiti „Prilagođeni imenski prostor (UUID)”, te „Naziv”, tj. niz znakova koji se identificira. Dajte v5 URL imenski prostor i https://example.com/a, i dobit ćete isti UUID danas, sutra i na tuđem stroju. Zbog toga „Broj” nestaje kada je odabran v3 ili v5: tisuću kopija jedne determinističke vrijednosti bilo bi samo tisuću kopija jedne determinističke vrijednosti. Za svaku drugu verziju „Broj” ide od 1 do 1000.
Četiri prekidača mijenjaju oblik rezultata bez mijenjanja 128 bitova ispod njega. „Velika slova” ispisuje heksadecimalne znamenke kao verzale, „Bez crtica” daje kompaktan oblik od 32 znaka koji preferiraju neke kolone i nazivi datoteka, a „Vitičaste zagrade” omotava vrijednost u { } — oblik koji Windows i .NET svijet nazivaju GUID. Pod „Napredne opcije”, urn:uuid: dodaje prefiks koji ga čini formalnim URN-om; dok je uključen, isključuje „Vitičaste zagrade” i „Bez crtica”, jer standard dopušta točno jedan oblik URN-a i to je onaj kanonski s crticama. „Format kopiranja” odlučuje kako se serija spaja kada je preuzimate: jedan po retku, odvojeni zarezima ili svaka vrijednost pod navodnicima sa zarezom na kraju, što se lijepi izravno u niz unutar koda. Ispod rezultata nalazi se redak koji izvještava o nasumičnosti u bitovima — 122 za v4, 62 za v7 — i, za v7, vremensku oznaku kodiranu u prvom identifikatoru serije, tako da je vrijeme unutar vrijednosti vidljivo, a ne skriveno. „Kopiraj sve” i „Spremi u datoteku” oboje poštuju „Format kopiranja”. „Povijest” čuva vaših zadnjih 10 serija u vašem pregledniku: kliknite jednu da biste je vratili, kopirajte ili izbrišite jedan unos ili očistite sve. „Očisti” prazni rezultat dok zadržava vaše postavke, a nakon 50 identifikatora popis postaje jedan pomični blok umjesto pedeset redaka.
Najposljedičnija stvar na ovoj stranici jest razlika između v4 i v7 kao primarnog ključa, a to nije stvar ukusa. Indeksi baze podataka su stabla koja se drže u sortiranom redoslijedu, a to gdje novi ključ slijeće u tom redoslijedu odlučuje o tome koliko posla iziskuje umetanje. v4 ključ je nasumičan, pa uzastopna umetanja slijeću u nepovezane kutove indeksa: stranice koje su bile pune dijele se, dijelovi stabla koje baza podataka drži u memoriji rijetko su oni dijelovi koji su potrebni za sljedeće umetanje, a indeks na kraju bude veći i fragmentiraniji nego što to zahtijevaju reci na koje ukazuje. v7 ključ počinje s trenutačnom milisekundom, pa uzastopna umetanja slijeću jedna pored drugih na desnom rubu stabla, što je uzorak koji proizvodi cijeli broj koji se automatski povećava i uzorak oko kojeg su izgrađene indeksne strukture. To je cjelokupan kompromis: v7 vam kupuje ponašanje pri umetanju kao kod sekvencijalnog ključa, dok zadržava svojstvo zbog kojeg ste uopće odabrali UUID-ove, a to je da svatko može iskovati jedan bez pitanja poslužitelja. Ono što to košta jest da je vrijeme stvaranja sada čitljivo unutar identifikatora, a hoće li to biti važno pitanje je o vašim podacima, a ne o formatu.
Nitko nikada ne provjerava jedinstvenost UUID-a; njegova veličina je garancija. Ne postoji registar, nema povratnog putovanja do poslužitelja, nema pretraživanja — generator proizvede broj i preda ga, a razlog zbog kojeg se dva ne sudaraju jednostavno je taj što postoji 2^122 mogućih vrijednosti v4, otprilike 5,3 sekstilijuna. Paradoks rođendana je pošten način za mjerenje toga: trebali biste imati otprilike 2,7 trilijuna identifikatora prije nego što postoji izjednačena šansa da se bilo koja dva podudare, što je milijardu novih UUID-ova svake sekunde tijekom 86 godina. Vrijedi biti precizan oko toga što to obećava, a što ne obećava. To je statistička garancija, a ne aritmetička, i drži samo dok je nasumičnost ispod nje stvarna — loše inicijaliziran generator, ili virtualni stroj koji je kloniran zajedno sa svojom zalihom entropije, razbija ga na način koji format ne može otkriti. Verzija 7 dodatno sužava pitanje: unutar jedne milisekunde jedan generator ne može ponoviti samog sebe, jer se brojač povećava umjesto da baca kockice, a kroz nezavisne generatore 62 nasumična bita obavljaju taj posao.
UUID je identifikator, a ne lozinka. Verzija 4 je nepredvidiva, a to ljude dovodi u iskušenje da ga tretiraju kao tajnu — vezu za ponovno postavljanje lozinke, URL koji se ne može pogoditi, sesijski token, API ključ. Nepredvidivost je stvarna, ali tajnost je svojstvo načina na koji se postupa s vrijednošću, a identifikatori se prema dizajnu neoprezno tretiraju: sjede u URL-ovima, koji završavaju u povijesti preglednika, zapisnicima poslužitelja, HTTP zaglavljima referer te analitici, te se zalijepe u chat poruke. Ostale verzije su još lošiji kandidati. Verzija 1 i verzija 7 obje kodiraju trenutak stvaranja, pa svatko tko drži jednu zna otprilike kada je napravljena i može suziti susjedstvo svega ostalog napravljenog uz nju. Verzije 3 i 5 su namjerno determinističke: v5 UUID adrese e-pošte nije sažeta tajna, to je vrijednost koju svatko s istom adresom može izračunati u jednoj sekundi. Koristite UUID za imenovanje stvari. Koristite generator lozinki, ili token iz biblioteke izgrađene za tajne, kada vrijednost mora ostati nepoznata.
Zašto odabrati ovaj generator UUID-a?
- Generiranje samo u pregledniku: identifikatori se stvaraju na vašem uređaju i nikad se nigdje ne šalju
- Nasumičnost Web Crypto API-ja: kriptografski sigurno, a ne Math.random()
- Pet verzija na jednom mjestu: v1, v3, v4, v5 i v7, bez mijenjanja alata
- Istinski sortirani v7: brojač unutar milisekunde, kao što opisuje RFC 9562
- Deterministički v3 i v5 s četiri standardna imenska prostora ili vašim vlastitim
- Do 1000 odjednom, s kompaktnim pomičnim popisom preko pedeset
- Svaki uobičajeni oblik: s crticama, bez crtica, velika slova, s vitičastim zagradama ili urn:uuid: URN
- Kopirajte kao retke, zareze ili vrijednosti pod navodnicima koje se izravno lijepe u kod
- Neograničeno i besplatno: nema prijave, nema ograničenja upotrebe, nema ničega na našim poslužiteljima
UUID-ovi se pojavljuju tamo gdje nešto treba biti imenovano prije nego što išta može potvrditi da je naziv slobodan. Aplikacijski kod kuje ih za retke koje se sprema umetnuti, tako da objekt ima identitet prije nego što je uopće stigao do baze podataka i tako da se klijent može referencirati na njega dok je pisanje još u letu. Distribuirani sustavi se još više oslanjaju na njih: nekoliko usluga koje zapisuju u jednu tablicu, izvanmrežni mobilni klijent koji stvara zapise u avionu, red čekanja koji mora prepoznati poruku koju je već obradio — ništa od toga ne može čekati svoj red za zajednički brojač. Verzija 5 pokriva drugu potrebu, a to je stabilan identifikator izveden iz nečega što već imate: isti dokument, isti URL ili isti račun uvijek preslikava na isti UUID, tako da se uvoz može pokrenuti dvaput bez udvostručavanja ičega. Drugdje, oni su jednostavno format koji sustav zahtijeva — korelacijski identifikator provučen kroz zapise i praćenja, naziv datoteke koji se neće sukobiti kada se prijenosi tisuća korisnika nađu u istom spremniku, ključ Windows registra, probni podaci koji moraju izgledati kao stvarni podaci.
Nekoliko iskrenih ograničenja vrijedi znati. Jedna serija je jedna verzija: vrijednost u „Verzija” primjenjuje se na sve u njoj, tako da su serija v4 i serija v7 dvije serije. Ovo je generator, a ne inspektor — lijepljenje UUID-a za čitanje njegove verzije ili vremenske oznake nije nešto što ova stranica radi. „Spremi u datoteku” ispisuje običnu tekstualnu datoteku, a ne CSV ili JSON. Verzija 7 otvoreno otkriva kada je stvorena, u milisekundu točno, što je stvarni kompromis prije nego nedostatak, a verzija 1 propušta vrijeme na isti način; ako je to problem za vaše podatke, verzija 4 je verzija koja nikome ne govori ništa. Dvije posebne vrijednosti iz standarda nisu verzije i stoga nisu opcije pod „Verzija”, ali ih možete kopirati odavde: nil UUID, 00000000-0000-0000-0000-000000000000 i max UUID, ffffffff-ffff-ffff-ffff-ffffffffffff. Sve na ovoj stranici slijedi RFC 9562, specifikaciju koja je 2024. zamijenila RFC 4122, tako da bilo koja biblioteka, baza podataka ili API koji uopće obrađuje UUID-ove prihvaća izlaz. Unutar tih ograničenja jamstvo je snažno: svaki identifikator izgrađen je prema standardu, iz kriptografski sigurne nasumičnosti, na vašem vlastitom stroju, i nitko ga drugi nikada ne vidi.