Ai nevoie de un identificator care să nu intre în coliziune cu unul creat de altcineva, pe o mașină de care nu ai auzit niciodată, fără să ceri permisiunea nimănui? Aceasta este sarcina pe care o îndeplinește un UUID. Este un număr pe 128 de biți, scris ca 36 de caractere în tiparul familiar 8-4-4-4-12, iar întregul său design face ca două dintre ele să nu fie niciodată identice, chiar dacă nimic nu coordonează cine primește ce. Acest generator gratuit le creează direct în browser: alege o versiune în „Versiune”, specifică de câte ai nevoie în „Număr” și apasă pe „Generează”. Pagina se deschide cu un singur v4, versiunea pe care o doresc majoritatea proiectelor, așadar primul identificator este la un singur clic distanță.
Fiecare identificator este construit de browserul tău prin Web Crypto API. Versiunea 4 folosește crypto.randomUUID() acolo unde browserul o oferă, sau altfel crypto.getRandomValues() — o sursă de aleatorietate criptografică puternică, în loc de o funcție pseudo-aleatoare din JavaScript precum Math.random(). Versiunea 7 pune în față un marcaj de timp pe 48 de biți la nivel de milisecundă, apoi un contor pe 12 biți care crește în cadrul aceleiași milisecunde, apoi 62 de biți aleatori, aceasta fiind metoda de ordonare descrisă în RFC 9562; acel contor este motivul pentru care un lot de o mie iese în ordine și nu amestecat. Versiunea 1 combină un marcaj de timp cu un identificator de nod aleator care are bitul de multicast setat, așa că nu conține niciodată adresa plăcii tale de rețea, așa cum făceau implementările originale din anii '90. Versiunile 3 și 5 nu sunt deloc aleatoare: ele aplică o funcție hash unui spațiu de nume împreună cu un nume, folosind MD5, respectiv SHA-1, iar acea operațiune de hashing are loc tot pe dispozitivul tău. Nimic nu este trimis către un server, nimic nu este înregistrat, iar odată ce pagina s-a încărcat, ea continuă să funcționeze chiar și cu conexiunea oprită.
„Versiune” este câmpul care decide tot restul. Versiunea 4 înseamnă 122 de biți aleatori fără nicio structură — varianta implicită și răspunsul corect atunci când un identificator trebuie doar să fie unic. Versiunea 7 păstrează 62 de biți aleatori, dar începe cu ora la care a fost creat, așa că un set de astfel de identificatori se sortează în ordinea în care au fost făcuți; de aceea este versiunea de ales când identificatorul va deveni o cheie de bază de date. Versiunea 1 este schema originală bazată pe timp, păstrată aici pentru sistemele care încă o cer. Versiunile 3 și 5 formează perechea ciudată: ele sunt deterministe, adică aceleași date de intrare produc întotdeauna același identificator, și necesită două câmpuri suplimentare — „Spațiu de nume”, care este unul dintre spațiile standard DNS, URL, OID și X.500 sau un „Spațiu de nume personalizat (UUID)”, și „Nume”, șirul de caractere identificat. Oferă versiunii 5 spațiul de nume URL și https://example.com/a și vei obține același UUID azi, mâine și pe mașina altcuiva. Din acest motiv, „Număr” dispare când sunt selectate v3 sau v5: o mie de copii ale unei valori deterministe ar fi doar o mie de copii ale aceleiași valori. Pentru oricare altă versiune, „Număr” merge de la 1 la 1000.
Patru comutatoare schimbă forma rezultatului fără a modifica cei 128 de biți de dedesubt. „Majuscule” tipărește cifrele hexazecimale cu litere mari, „Fără cratime” oferă forma compactă de 32 de caractere preferată de anumite coloane și nume de fișiere, iar „Acolade” înfășoară valoarea în { } — forma pe care Windows și lumea .NET o numesc un GUID. Sub „Opțiuni avansate”, urn:uuid: adaugă prefixul care îl face un URN formal; acesta dezactivează „Acolade” și „Fără cratime” atâta timp cât este pornit, deoarece standardul permite exact o formă de URN, și anume cea canonică cu cratime. „Format de copiere” decide modul în care un lot este unit atunci când îl preiei: unul pe rând, separate prin virgulă, sau fiecare valoare între ghilimele cu o virgulă la final, putând fi lipite direct într-un array în cod. Sub rezultat se află un rând care raportează aleatorietatea în biți — 122 pentru v4, 62 pentru v7 — și, pentru v7, marcajul de timp codat în primul identificator al lotului, astfel încât timpul din interiorul valorii este vizibil în loc să fie dedus. Atât „Copiază tot” cât și „Salvează în fișier” respectă formatul ales în „Format de copiere”. „Istoric” păstrează ultimele tale 10 loturi în propriul browser: dă clic pe unul pentru a-l readuce, copiază sau șterge o singură intrare, sau șterge tot. „Șterge” golește rezultatul și lasă setările intacte, iar după 50 de identificatori lista devine un singur bloc care poate fi derulat, în loc de cincizeci de rânduri.
Cel mai important lucru de pe această pagină este diferența dintre v4 și v7 ca cheie primară (primary key), și nu este o chestiune de gust. Indecșii bazelor de date sunt arbori păstrați în ordine sortată, iar locul unde ajunge o cheie nouă în acea ordine decide cât de mult efort va costa inserarea. O cheie v4 este aleatoare, așa că inserările consecutive aterizează în colțuri fără legătură ale indexului: paginile care erau pline se divid, părțile arborelui pe care baza de date le ține în memorie sunt rareori părțile de care va avea nevoie următoarea inserare, iar indexul ajunge să fie mai mare și mai fragmentat decât ar justifica rândurile la care indică. O cheie v7 începe cu milisecunda curentă, așa că inserările consecutive ajung una lângă cealaltă la marginea din dreapta a arborelui, acesta fiind tiparul pe care îl produce un număr întreg auto-incrementat și tiparul în jurul căruia au fost construite structurile de indecși. Acesta este întregul compromis: v7 îți oferă comportamentul de inserare al unei chei secvențiale păstrând proprietatea care te-a făcut să alegi UUID-uri în primul rând, și anume că oricine poate emite unul fără a întreba un server. Costul este că timpul creării se poate acum citi în interiorul identificatorului, iar dacă asta contează este o întrebare despre datele tale, nu despre format.
Nimic nu verifică vreodată un UUID pentru unicitate; mărimea sa este garanția. Nu există niciun registru, nicio interogare dus-întors la un server, nicio căutare — un generator produce un număr și îl predă, iar motivul pentru care două nu intră în coliziune este pur și simplu că există 2^122 valori v4 posibile, aproximativ 5,3 sextilioane. Problema zilelor de naștere (birthday problem) este modul onest de a estima asta: ai avea nevoie de aproximativ 2,7 trilioane de identificatori înainte să existe șanse egale ca oricare două să se potrivească, ceea ce înseamnă un miliard de UUID-uri noi în fiecare secundă timp de 86 de ani. Merită să fim exacți în privința la ce anume promite și ce nu promite asta. Este o garanție statistică, nu una aritmetică, și se menține doar atâta timp cât aleatorietatea de dedesubt este reală — un generator cu o sămânță proastă (seed), sau o mașină virtuală clonată împreună cu fondul său de entropie, o distruge într-un mod pe care formatul nu-l poate detecta. Versiunea 7 restrânge și mai mult problema: în cadrul unei singure milisecunde, un generator nu se poate repeta deloc, pentru că numărătorul crește în loc să arunce zaruri, iar între generatoare independente cei 62 de biți aleatori fac toată treaba.
Un UUID este un identificator, nu o parolă. Versiunea 4 este imprevizibilă, iar asta îi ispitește pe oameni să o trateze ca pe un secret — un link de resetare a parolei, un URL imposibil de ghicit, un token de sesiune, o cheie API. Imprevizibilitatea este reală, dar secretul este o proprietate a modului în care este manipulată o valoare, iar identificatorii sunt manipulați fără grijă prin design: ei stau în URL-uri, care ajung în istoricul browserului, în jurnalele serverului, în antetele referrer și în analitice, și sunt lipiți în mesaje de chat. Celelalte versiuni sunt candidați și mai slabi. Versiunile 1 și 7 codifică momentul creării, așa că oricine deține unul știe aproximativ când a fost făcut și poate restrânge contextul tuturor lucrurilor create odată cu el. Versiunile 3 și 5 sunt deterministe intenționat: un UUID v5 al unei adrese de email nu este un secret hashat, este o valoare pe care oricine are aceeași adresă o poate calcula într-o secundă. Folosește un UUID pentru a numi un lucru. Folosește un generator de parole, sau un token dintr-o bibliotecă construită pentru secrete, atunci când valoarea trebuie să rămână necunoscută.
De ce să alegi acest generator UUID?
- Generare doar în browser: identificatorii sunt făcuți pe dispozitivul tău și nu sunt trimiși niciodată nicăieri
- Aleatorietate din Web Crypto API: sigur din punct de vedere criptografic, nu folosește Math.random()
- Cinci versiuni într-un singur loc: v1, v3, v4, v5 și v7, fără a schimba instrumentul
- Versiunea 7 ordonată autentic: un contor în cadrul milisecundei, așa cum descrie RFC 9562
- Determinist pentru v3 și v5 cu cele patru spații de nume standard sau al tău propriu
- Până la 1000 odată, cu o listă compactă derulabilă peste cincizeci de valori
- Orice formă comună: cu cratime, gol, litere mari, cu acolade sau ca un URN urn:uuid:
- Copiere ca rânduri, virgule sau valori cu ghilimele ce pot fi lipite direct în cod
- Nelimitat și gratuit: fără înregistrare, fără limite de utilizare, nimic pe serverele noastre
UUID-urile apar oriunde ceva trebuie să fie numit înainte ca cineva să poată confirma că numele este liber. Codul aplicației le emite pentru rândurile pe care urmează să le insereze, astfel încât obiectul are o identitate înainte de a ajunge vreodată în baza de date și un client poate face referire la el în timp ce scrierea este încă în desfășurare. Sistemele distribuite se bazează și mai mult pe ele: mai multe servicii care scriu în același tabel, un client mobil offline care creează înregistrări de la distanță, o coadă care trebuie să recunoască mesajul pe care l-a procesat deja — niciunul dintre acestea nu își poate aștepta rândul la un contor partajat. Versiunea 5 acoperă o nevoie diferită, aceea de a avea un identificator stabil derivat din ceva ce ai deja: același document, același URL sau același cont se mapează mereu la același UUID, astfel încât un import poate rula de două ori fără a duplica nimic. În alte cazuri, ele sunt pur și simplu formatul pe care îl cere un sistem — un identificator de corelație transmis prin log-uri și trasabilitate, un nume de fișier care nu va intra în coliziune când încărcările de la o mie de utilizatori ajung într-un singur container, o cheie de registry în Windows, o componentă de testare (test fixture) care trebuie să arate ca datele reale.
Câteva limite oneste merită cunoscute. Un lot înseamnă o singură versiune: valoarea din „Versiune” se aplică la tot ce este în el, deci o serie de v4 și o serie de v7 înseamnă două loturi. Acesta este un generator, nu un inspector — să lipești un UUID pentru a-i citi versiunea sau marcajul de timp nu este ceva ce face această pagină. „Salvează în fișier” scrie un fișier text simplu, nu CSV sau JSON. Versiunea 7 dezvăluie deschis când a fost creat, până la milisecundă, ceea ce este un compromis real, nu un defect, iar versiunea 1 scapă timpul în același mod; dacă asta este o problemă pentru datele tale, versiunea 4 este varianta care nu spune nimănui nimic. Două valori speciale din standard nu sunt versiuni și, prin urmare, nu sunt opțiuni în „Versiune”, dar le poți copia de aici: UUID-ul nul (nil), 00000000-0000-0000-0000-000000000000, și UUID-ul maxim (max), ffffffff-ffff-ffff-ffff-ffffffffffff. Totul pe această pagină urmează RFC 9562, specificația care a înlocuit RFC 4122 în 2024, așadar rezultatul este acceptat de orice bibliotecă, bază de date sau API care gestionează UUID-uri. În cadrul acestor limite, garanția este una puternică: fiecare identificator este construit conform standardului, dintr-o sursă de aleatorietate sigură criptografic, pe propria ta mașină, iar nimeni altcineva nu îl va vedea vreodată.