Ce este un ULID și cum funcționează această pagină
Pagina ulid-generator produce identificatori ULID — un format de 26 de caractere, case‑insensitive, fără cratime, care combină un timestamp de milisecunde cu o componentă aleatoare. Utilizatorul alege formatul (ULID), stabilește un număr între 1 și 100 de identificatori, iar instrumentul generează instantaneu lista. Fiecare ULID poate fi copiat individual printr‑un click, sau toate odată cu butonul „Copiază tot”, moment în care apare mesajul „Copied all!”. Starea curentă este indicată de mesajele „Ready.” (înainte de generare) și „Generated.” (după generare).
Spre deosebire de celelalte formate disponibile pe același instrument, ULID produce șiruri mai scurte decât UUID‑urile (26 caractere față de 36), folosește exclusiv alfabetul Crockford base32 — ceea ce le face case‑insensitive și lipsite de cratime — și sunt sortabile lexicografic după momentul creării, deoarece primele 10 caractere codifică un timestamp cu precizie de milisecundă. De asemenea, sunt sigure pentru URL fără a necesita escapare. Pagina nu oferă comutatoare pentru litere mari sau cratime, deoarece ULID este inherent case‑insensitive și nu conține cratime. Componenta aleatoare ocupă ultimele 16 caractere (80 de biți), iar valoarea totală este de 128 de biți.
Toată generarea are loc local în browser, folosind crypto.getRandomValues() — nimic nu este transmis către vreun server. Modificarea oricărei opțiuni (format, număr) regenerază automat lista.
Structura internă a unui identificator ULID
Un ULID este alcătuit din 128 de biți, împărțiți în două părți: primii 48 de biți reprezintă un timestamp exprimat în milisecunde de la epoca Unix, iar următorii 80 de biți sunt complet aleatori. Timpul este codificat cu ajutorul alfabetului Crockford base32, care produce primele 10 caractere ale șirului. De exemplu, un ULID precum 01ARZ3NDEKTSV4RRFFQ69G5FAV poate fi descompus astfel: 01ARZ3NDEK provine din timestamp (echivalentul a aproximativ 1.468.399.500.000 ms, adică 15 iulie 2016), iar TSV4RRFFQ69G5FAV este partea aleatoare. Pe măsură ce timpul trece, cronologia este încorporată direct în identificator, permițând sortarea lexicografică exact în ordinea creării.
Deoarece primele caractere se modifică odată cu trecerea milisecundelor, ULID‑urile sunt aproximativ monotonic crescătoare. Totuși, dacă două ULID‑uri sunt generate în aceeași milisecundă, ordinea lor nu mai poate fi garantată strict crescătoare — partea aleatoare decide, iar sortarea lexicografică nu reflectă neapărat succesiunea reală la acest interval granular.
De ce Crockford base32 face ULID‑urile case‑insensitive și sigure pentru URL
Alfabetul Crockford base32 conține caracterele 0–9 și literele A–Z, dar exclude literele I, L, O și U pentru a evita confuziile vizuale (de exemplu, I cu 1, O cu 0). De asemenea, caracterele sunt tratate case‑insensitive: a este echivalent cu A, b cu B, ș.a.m.d. Un instrument de citire ULID va normaliza automat la litere mari înainte de decodare. Aceasta înseamnă că utilizatorii pot scrie manual identificatorii cu litere mici sau mari, fără a risca erori de validare.
Toate caracterele din alfabetul Crockford base32 sunt ne rezervate conform RFC 3986, ceea ce înseamnă că nu necesită niciun fel de percent‑encoding atunci când sunt incluse în URL‑uri. De exemplu, un ULID ca 01ARZ3NDEKTSV4RRFFQ69G5FAV poate fi plasat direct într‑o adresă web fără a fi nevoie de %7C sau alte transformări. Aceasta simplifică semnificativ implementarea în sistemele web.
ULID comparat cu UUID v4 și v7
Tabelul de mai jos prezintă principalele diferențe între ULID, UUID v4 și UUID v7:
| Caracteristică | ULID | UUID v4 | UUID v7 |
|---|---|---|---|
| Lungime șir | 26 caractere | 36 caractere (cu cratime) | 36 caractere (cu cratime) |
| Cratime | Nu | Da (4 cratime) | Da (4 cratime) |
| Case‑insensitive | Da | Nu (conform specificației, litere mici) | Nu (conform specificației, litere mici) |
| Conține timestamp | Da (48 biți, milisecunde) | Nu | Da (48 biți, milisecunde) |
| Sortabilitate lexicografică | Da | Nu | Da (aproximativ) |
| Biți aleatori | 80 | 122 | 74 |
| URL‑safe fără escapare | Da | Da (dar cratimele pot fi problematice) | Da (dar cratimele pot fi problematice) |
ULID este mai compact decât ambele variante UUID. Dacă un UUID v4 ocupă 36 de caractere (din care 32 sunt hexazecimale și 4 sunt cratime), ULID folosește doar 26 de caractere pentru același număr total de 128 de biți. Aceasta reduce spațiul de stocare în bazele de date și face identificatorii mai ușor de citit sau transmis manual.
În ceea ce privește sortabilitatea, UUID v7 adaugă și el un timestamp, dar păstrează cratimele și case‑sensitivity. ULID elimină cratimele și normalizează literele, simplificând procesarea.
Comportamentul la sortare și limitările ordinii
Deoarece primele 10 caractere corespund unui timestamp de milisecunde, ULID‑urile sunt sortabile lexicografic în ordinea cronologică a creării lor. De exemplu, un ULID generat la ora 12:00:00.000 (timestamp 1.700.000.000.000) va începe cu 01H, în timp ce unul generat la 12:00:00.001 va începe cu 01J. Comparând lexicografic șirurile, 01H < 01J, deci ordinea este corectă.
Totuși, în aceeași milisecundă, partea aleatoare de 80 de biți decide ordinea. Dacă două ULID‑uri sunt create exact în același moment, prima componentă (primele 10 caractere) va fi identică, iar apoi compararea se va baza pe următoarele caractere. Practic, nu există nicio garanție că ULID‑urile generate secvențial în aceeași milisecundă vor fi sortate în ordinea generării. Pentru majoritatea aplicațiilor, aceasta nu este o problemă, dar pentru sistemele care necesită o ordine strictă la nivel de microsecundă, este o limitare importantă.
Probabilitatea de coliziune și riscurile practice
ULID alocă 80 de biți pentru componenta aleatoare. Numărul total de combinații posibile este de 2^80, adică aproximativ 1,2 × 10^24. Probabilitatea de coliziune depinde de numărul de identificatori generați. Cu cât se produc mai mulți identificatori într‑un interval scurt, cu atât riscul crește, dar chiar și la o rată de 1 milion de ULID‑uri pe secundă, probabilitatea de a găsi o coliziune după un an de generare continuă rămâne extrem de mică (sub 10^-15). Pentru uzul zilnic, unde se generează cel mult 100 de identificatori odată, riscul practic este neglijabil.
Totuși, trebuie reținut că partea aleatoare este generată cu crypto.getRandomValues(), o sursă criptografic sigură disponibilă în toate browserele moderne. Nu există niciun element de predicție sau de seed‑reutilizare — fiecare ULID este cu adevărat independent de celelalte.
Întrebări frecvente
1. De ce ULID are exact 26 de caractere?
ULID codifică 128 de biți folosind alfabetul Crockford base32, care necesită 26 de caractere pentru a reprezenta întreaga valoare (128 ÷ 5 = 25,6, rotunjit la 26). Fiecare caracter codifică 5 biți, iar ultimul caracter include doar 3 biți utili.
2. Pot genera ULID‑uri cu litere mari?
Da, dar nu este necesar. Pagina generează automat litere mari, deoarece Crockford base32 tratează literele mari și mici ca echivalente. Dacă copiați un ULID cu litere mici, sistemul îl va interpreta corect.
3. ULID‑urile sunt sortabile cronologic?
Da, sortarea lexicografică a șirurilor corespunde ordinii cronologice a timpului de creare, cu precizie de milisecundă. În aceeași milisecundă, ordinea este dictată de partea aleatoare și nu mai este garantată.
4. Care este riscul de coliziune când generez 100 de ULID‑uri?
Extrem de mic. Componenta aleatoare de 80 de biți înseamnă că probabilitatea de a găsi o coliziune între 100 de identificatori generati este sub 10^-18. Nu trebuie să vă faceți griji pentru duplicări accidentale.
5. Pot folosi ULID în URL‑uri fără a le escapa?
Da. Toate caracterele din alfabetul Crockford base32 sunt ne rezervate conform RFC 3986, deci pot fi incluse direct în URL‑uri fără percent‑encoding.
6. Cum este generat random‑ul în această pagină?
Browserul folosește crypto.getRandomValues(), o funcție criptografic sigură disponibilă în toate browserele moderne. Identificatorii sunt creați local, fără a fi transmiși către niciun server.