ULID generator

Generirajte ULID-ove na mreži: ID-ovi od 26 znakova u Crockford Base32 formatu s 48-bitnim vremenom i 80 nasumičnih bita.

Format
Generirani ID-jevi
Spremno. Generirajte ULID-ove u svom pregledniku.

Kako se gradi ovaj ID

Izgled
26 Crockford Base32 znakova: 10 vremenskih znakova nakon kojih slijedi 16 nasumičnih znakova.
Entropija
80 nasumičnih bita nakon 48-bitne vremenske oznake u milisekundama.
Vrijeme
Da. Prvih 10 znakova kodira vrijeme u milisekundama, a leksički poredak prati vrijeme.
Rizik od kolizije
Nasumični završetak ima 80 bita; rizik se uglavnom odnosi na to koliko ID-ova stvorite u istoj milisekundi.
Primjer
01M12BRPTE4WVFTKZWKAC0K7YS

Vaši se ID-jevi generiraju lokalno pomoću jake nasumičnosti preglednika. Ništa se ne šalje na BroBroGo.

Česta pitanja

Za što je ULID dobar?

ULID je kompaktan, prilagođen URL-ovima i može se sortirati po vremenu kao običan tekst, što je korisno za zapise (logs), ključeve objekata i zapise koje treba sortirati prema vremenu stvaranja.

Je li ULID isto što i UUID v7?

Ne. Oba uključuju vrijeme u milisekundama, ali ULID koristi Crockford Base32 i 26 znakova, dok UUID v7 zadržava standardni heksadecimalni oblik UUID-a.

Uvod

Ova stranica omogućuje trenutno generiranje identifikatora u ULID formatu. Odaberete li ULID kao vrstu identifikatora i postavite željeni broj (između 1 i 100), alat ispisuje popis jedinstvenih nizova znakova duljine 26, bez crtica i bez razlike između velikih i malih slova. Svaki ULID možete kopirati pojedinačno klikom na njega, a gumbom za kopiranje cijelog popisa dobivate statusnu poruku „Copied all!“. Stranica prikazuje i broj generiranih ID-ova te jednostavna stanja: „Ready.“, „Generated.“ i „Copied all!“.

Ono što ovu stranicu izdvaja od ostalih formata na istom alatu jest upravo ULID – identifikator koji je kraći od UUID‑a (26 znakova naspram 36) i koji koristi isključivo Crockfordov base32 alfabet. To ga čini neosjetljivim na veličinu slova i potpuno bez crtica. Zahvaljujući prvih deset znakova koji sadrže vremensku oznaku milisekundne preciznosti, ULID‑ovi su leksikografski poredani po vremenu nastanka (mogu se sortirati). Istovremeno su sigurni za upotrebu u URL‑ovima bez ikakvog escape‑anja.

Stranica nema prekidače za velika slova ili crtice – kod ULID‑a su oni suvišni jer je sam format neosjetljiv na veličinu slova i ne sadrži crtice. Slučajni dio čini preostalih 16 znakova (80 bita), a ukupna vrijednost je 128 bita.

Unutarnja struktura ULID‑a

ULID je 128‑bitni identifikator koji se sastoji od dva dijela:

  • Vremenska oznaka (48 bita) – smještena u prvih 10 znakova, kodira broj milisekundi od epohe (Unix epoch). To omogućuje sortiranje ID‑ova po redu stvaranja, bez potrebe za zasebnim stupcem vremena.
  • Slučajni dio (80 bita) – preostalih 16 znakova generira se kriptografski jakim generatorom slučajnih brojeva u pregledniku (putem crypto.getRandomValues()).

Ukupno 128 bita znači da je prostor adresa jednako velik kao i kod UUID‑a, ali je prikaz puno kompaktniji. Zbog načina na koji je vremenska oznaka kodirana, ULID‑ovi su leksikografski poredani – ako imate dva ULID‑a, možete ih abecedno usporediti i znati koji je nastao ranije (osim ako su generirani u istoj milisekundi, vidi dolje).

Bitovi se preslikavaju u znakove pomoću Crockfordovog base32 kodiranja. Svaki znak predstavlja 5 bita (jer 2⁵ = 32). Deset znakova daje 10 × 5 = 50 bita, ali prvih 48 bita je vremenska oznaka, a preostala 2 bita (od desetog znaka) zapravo su dio slučajnog dijela? – ne, točna podjela: 48 bita vremena + 80 bita slučajnosti = 128 bita. 128 bita podijeljeno s 5 bita po znaku daje 25,6 znakova – zapravo je 26 znakova jer se zadnji znak koristi samo s 2 bita (128 – 25×5 = 3 bita, ali standard koristi 26 znakova za 130 bita? – treba provjeriti. Iz literatur: ULID ima 26 znakova, 128 bita. 26×5 = 130 bita, 2 bita su “padding” ili se jednostavno izostavljaju. Standard kaže: 26 znakova, prvi dio (10 zn) za vrijeme (48 bita = 10×5 = 50 bita, od kojih se 2 bita ignoriraju ili su nula), a preostalih 16 znakova za slučajnost (80 bita). To je u redu.

No, za potrebe ovog članka dovoljno je znati da se prvih 10 znakova odnosi na vrijeme, a preostalih 16 na slučajnost.

Crockford base32 i zašto je važan

Crockfordov base32 alfabet sastoji se od znakova 0‑9 i A‑Z, ali izostavlja slova I, L, O, U. Time se uklanjaju vizualne dvosmislenosti – primjerice, slovo I i broj 1, slovo O i broj 0, slovo L i broj 1, te slovo U koje se može zamijeniti s V. Rezultat je skup znakova koji su lako čitljivi i ne zahtijevaju provjeru veličine slova: malo slovo “a” tretira se isto kao veliko “A”, i tako dalje.

Zbog toga ULID ne treba opcije za velika/mala slova ili crtice. Bez crtica je i bez ikakvih razdjelnika, što ga čini pogodnim za prijenos u okruženjima gdje su crtice zabranjene ili otežavaju parsiranje.

Također, svi znakovi u Crockford base32 su “unreserved” prema RFC 3986 – to znači da se mogu koristiti u URL‑ovima bez postotnog kodiranja. To je jedna od ključnih prednosti nad UUID‑ovima koji sadrže crtice (koje su dopuštene, ali nisu uvijek zgodne) ili nad nekim drugim formatima koji zahtijevaju escape.

Usporedba s UUID‑om v4 i v7

Najčešća alternativa ULID‑u je UUID (Universally Unique Identifier), posebice verzija 4 (slučajni) i verzija 7 (vremenski sortirani). Evo ključnih razlika:

Značajka ULID UUID v4 UUID v7
Duljina niza 26 znakova 36 znakova (32 heksa + 4 crtice) 36 znakova
Broj bita 128 128 128
Vremenska oznaka Da (48 bita, ms) Ne Da (48 bita, ms)
Sortabilnost Leksikografski po vremenu Ne Leksikografski po vremenu
Osjetljivost na veličinu slova Ne (Crockford base32) Da (heksadecimalna slova razlikuju se) Da (heksadecimalna slova)
URL‑safe bez escapea Da Djelomično (crtice su dopuštene, ali nisu sve) Djelomično
Crtice Nema 4 crtice 4 crtice

ULID je tako kraći, neosjetljiv na veličinu slova (što olakšava ručni unos) i nema crtice, što ga čini kompaktnijim za prikazivanje u korisničkom sučelju ili u logovima. U usporedbi s UUID v7, oba imaju vremensku oznaku, ali ULID koristi efikasnije kodiranje (base32 vs. heksadecimalno) i time štedi 10 znakova.

Sortiranje i vremenski aspekt – prednosti i ograničenja

Zahvaljujući vremenskoj oznaci na početku, ULID‑ovi su leksikografski poredani po trenutku stvaranja. To znači da ako imate popis ULID‑ova, možete ih jednostavno sortirati abecedno i dobiti kronološki redoslijed. Ovo je izuzetno korisno u bazama podataka gdje indeksi temeljeni na B‑stablu bolje rade kada se novi ključevi umeću monotono rastućim redoslijedom – nasuprot potpuno slučajnim UUID‑ovima koji uzrokuju fragmentaciju.

Međutim, ULID ne jamči strogi poredak za ID‑ove generirane unutar iste milisekunde. Ako se na istom uređaju u istoj milisekundi generira više ULID‑ova, vremenski dio će biti identičan, a redoslijed će odrediti slučajni dio, koji nije vremenski uređen. To je prihvatljivo za većinu primjena, ali ako vam treba strogi poredak unutar iste milisekunde, trebat ćete dodatni mehanizam (npr. sekvencijski broj).

Vjerojatnost kolizije

Slučajni dio ULID‑a ima 80 bita, što daje 2⁸⁰ ≈ 1,2 × 10²⁴ mogućih vrijednosti. Vjerojatnost kolizije pri generiranju N ID‑ova približno je N² ∕ (2 × 2⁸⁰). Za generiranje milijun ULID‑ova vjerojatnost je iznimno niska (reda 10⁻¹⁰). U praksi, s obzirom da se generiranje odvija u pregledniku i da se nikad ne šalje na poslužitelj, rizik kolizije je zanemariv za sve uobičajene primjene.

Tko treba ULID generatore i zašto

  • Web i mobilni developeri koji trebaju kraće identifikatore sigurne za URL, a istovremeno sortabilne po vremenu bez dodatnog stupca.
  • Administratori baza podataka koji dizajniraju primarne ključeve za poboljšanje performansi B‑stabla – novi ključevi umeću se približno monotono.
  • Arhitekti distribuiranih sustava gdje identifikatori moraju biti jedinstveni na više čvorova, sortabilni, ali i kompaktni (manje prostora u zapisnicima, brži prijenos).
  • Dizajneri API‑ja koji žele javne ID‑ove otporne na pogađanje (slučajni dio), a istovremeno ljudski čitljive – bez zabune zbog malih/velikih slova i bez crtica.

Generiranje u pregledniku i privatnost

Svi ULID‑ovi generiraju se lokalno, u vašem pregledniku, korištenjem kriptografski sigurnog generatora crypto.getRandomValues(). Nitko – ni vlasnik stranice ni bilo koji poslužitelj – ne prima podatke o generiranim identifikatorima. To je bitna prednost u odnosu na online generatore koji šalju zahtjeve na poslužitelj. Promjena bilo koje opcije (formata, broja) automatski ponovno generira popis.

Česta pitanja

Je li ULID siguran za korištenje u URL‑ovima bez escape‑anja?
Da. Svi znakovi u Crockfordovom base32 alfabetu (0‑9, A‑Z izuzev I, L, O, U) spadaju u nezaštićene znakove prema RFC 3986, pa ih možete izravno koristiti u dijelovima URL‑a poput putanje ili upita bez postotnog kodiranja.

Mogu li se dogoditi duplikati ULID‑ova?
Teoretski da, ali vjerojatnost je iznimno mala. Uz 80‑bitni slučajni dio, za generiranje 10⁶ ID‑ova vjerojatnost kolizije približno je 10⁻¹⁰. U praksi, ako se generiraju na istom računalu, unutar iste milisekunde može se dogoditi kolizija samo ako slučajni dio bude isti – što je izuzetno rijetko.

Zašto na stranici nema opcije za velika slova ili crtice?
ULID je po definiciji neosjetljiv na veličinu slova (Crockford base32 ignorira razliku) i ne sadrži crtice. Stoga su takve opcije nepotrebne.

Kako se generira slučajni dio ULID‑a?
Pomoću crypto.getRandomValues() koji daje kriptografski jake slučajne brojeve. To je ista funkcija koju preglednici koriste za generiranje sigurnih lozinki i tokena.

Što se događa ako unesem više od 100 ID‑ova?
Stranica prihvaća samo brojeve između 1 i 100. Vrijednosti izvan tog raspona neće se generirati.

Može li se ULID koristiti kao primarni ključ u bazi podataka?
Da, i to je jedna od njegovih najčešćih namjena. Budući da su ULID‑ovi približno monotono rastući (zahvaljujući vremenskoj oznaci), indeksi u B‑stablu umeću se efikasnije nego s potpuno slučajnim UUID‑ovima.