Salt la conținut

Ghid pentru Generator UUID

Ghid de instrument. Actualizat .

Cum creează Generator UUID identificatori UUID v4, UUID v7 și ULID, prin ce diferă formatele, care e potrivit pentru chei de bază de date și cum decodați unul.

Ce este un UUID

Un identificator unic universal (UUID), numit și GUID în ecosistemele Microsoft, este o valoare de 128 de biți scrisă ca 32 de cifre hexazecimale în cinci grupuri, de exemplu 018f3a2e-7b1c-7d2a-9f4e-2b6c8a1d3e5f. Sistemele creează UUID-uri independent unele de altele, fără un contor central, iar șansa ca două UUID-uri aleatoare să se ciocnească este neglijabilă. Tocmai de aceea sunt folosite pe scară largă drept chei de bază de date, identificatori de cereri și nume de fișiere. Chiar dacă generați valori pe servere diferite sau pe un client offline, ele nu intră în conflict. Spre deosebire de numerele întregi cu incrementare automată, un UUID nu dezvăluie câte înregistrări ați creat și nici identificatorul următoarei.

RFC 9562 (2024) a înlocuit documentul original RFC 4122 și a adăugat versiuni noi, cea mai importantă fiind v7. Patru biți din fiecare UUID păstrează versiunea, iar doi sau trei biți varianta; de aceea a treisprezecea cifră hexazecimală arată numărul versiunii. Biții de variantă stau la începutul celei de-a șaptesprezecea cifre și spun ce aranjament urmează restul valorii. Pentru că locul acestor două câmpuri este fix, puteți analiza o valoare chiar fără să știți ce bibliotecă a generat-o. Trimiterile la vechiul RFC 4122 încă circulă, dar formatul a rămas același, așa că valorile vechi și cele noi sunt compatibile.

Structura unui UUID v7Un UUID v7 păstrează întâi un timestamp Unix de 48 de biți în milisecunde, apoi cei patru biți ai versiunii, biți aleatori, biții de variantă și restul biților aleatori.48 de biți: timp Unix în milisecunde018f3a2e-7b1c: sortează valorile după momentulcreării4 biți: versiunea (7)Prima cifră hexazecimală a grupului al treilea12 biți: aleatoriRestul grupului al treilea2 biți: varianta (10)Prima cifră hexazecimală a grupului alpatrulea este 8, 9, a sau b62 de biți: aleatoriRestul valorii
Un UUID v7 păstrează întâi un timestamp Unix de 48 de biți în milisecunde, apoi cei patru biți ai versiunii, biți aleatori, biții de variantă și restul biților aleatori.

Cum folosiți Generator UUID

  1. Deschideți Generator UUID și alegeți tipul de identificator: UUID v4, UUID v7 sau ULID.
  2. Alegeți câte valori generați și dacă literele trebuie scrise cu majuscule.
  3. Apăsați Generează și copiați identificatorii.
  4. Ca să examinați un UUID existent, lipiți-l în Decodați un UUID și îi vedeți acolo versiunea, varianta și timpul încorporat.

Valorile sunt generate cu sursa sigură de numere aleatoare a browserului și nu sunt trimise nicăieri, așa că pot fi folosite direct ca identificatori în date de test sau în fișiere de configurare. Pagina funcționează și offline, pentru că generarea și decodarea au loc în întregime în fila dumneavoastră. În șirul de interogare nu ajunge nicio valoare introdusă, deci un UUID pe care îl decodați nu rămâne nici în istoricul browserului. Generarea în bloc vă ajută când pregătiți date de test. Pentru volume foarte mari este mai practic să faceți aceeași treabă în cod; exemple găsiți mai jos.

Cum alegeți între v4, v7 și ULID

Tipuri de identificatori
TipStructurăSe sortează după timpCel mai potrivit pentru
UUID v4122 de biți aleatoriNuIdentificatori generali, când ordinea nu contează
UUID v7Timestamp de 48 de biți în ms + biți aleatoriDaChei primare de bază de date, identificatori de evenimente și de jurnal
ULIDTimestamp de 48 de biți în ms + 80 de biți aleatori, 26 de caractere Crockford base32DaIdentificatori compacți și sortabili în URL-uri și nume de fișiere
UUID v1Timestamp + identificator de nod (adesea o adresă MAC)ParțialSisteme vechi; pot scurge informații despre gazdă. XGM folosește un identificator de nod aleatoriu, așa că nu scurge nimic
UUID v3 / v5MD5 sau SHA-1 peste un UUID de spațiu de nume și un numeNuAcolo unde același nume trebuie să dea mereu același identificator; v5 pentru orice lucru nou

Cheile v4 aleatoare împrăștie inserările prin tot indexul bazei de date, ceea ce duce la divizări de pagini și la rateuri de cache în tabelele mari. Cheile v7, ordonate în timp, se adaugă aproape de finalul indexului, asemenea numerelor întregi cu incrementare automată, și păstrează în același timp avantajele UUID-urilor. Pentru sistemele noi care stochează UUID-uri drept chei primare, v7 este de obicei alegerea implicită mai bună. Același avantaj se vede și în tabelele de evenimente interogate pe intervale de timp. Nu este obligatoriu să mutați un tabel existent de la v4 la v7; v7 doar pentru înregistrările noi corectează deja creșterea indexului.

v7 dezvăluie momentul creării

Oricine vede un UUID v7 sau un ULID poate citi când a fost creat, cu precizie de milisecundă. Dacă informația aceasta este sensibilă pentru dumneavoastră, de exemplu pentru identificatorii de cont afișați în URL-uri, folosiți v4 pentru identificatorii publici.

Decodarea unui UUID

Cifra versiunii vă spune cum a fost creat un UUID. Pentru v1 și v7, decodorul extrage și timestampul și îl afișează ca dată. Este arătată și varianta: valorile care respectă RFC 9562 sunt etichetate ca atare, în timp ce variantele NCS, Microsoft și cele rezervate viitorului, din specificațiile mai vechi, sunt marcate ca rezervate. Valorile nil, formate numai din zerouri, și max, formate numai din f, sunt raportate după nume, nu printr-un număr de versiune. Dacă valoarea introdusă nu este un UUID valid, instrumentul o spune separat.

Decodarea este utilă când căutați o eroare. O cheie v7 dintr-o linie de jurnal vă spune când a fost creată înregistrarea, fără nicio interogare în baza de date, iar un UUID v1 neașteptat într-un sistem nou arată către o bibliotecă veche sau către o componentă care încă folosește identificatori de tip timp-și-nod. UUID-urile nil și max apar ca marcaje de rezervă în datele de test și în valorile implicite. Compararea versiunii și a variantei arată repede ce valoare vine din ce bibliotecă. Un timp încorporat mult prea departe de ziua de azi semnalează de obicei un ceas de server deviat.

Citirea versiunii și a variantei
018f3a2e-7b1c-7d2a-9f4e-2b6c8a1d3e5f
               ^    ^
               |    variant: 9 → binary 10xx (RFC 9562)
               version: 7

f47ac10b-58cc-4372-a567-0e02b2c3d479
               ^    ^
               |    variant: a → RFC 9562
               version: 4 (random)
Valori speciale
ValoareSemnificație
00000000-0000-0000-0000-000000000000UUID nil, folosit adesea cu sensul „fără valoare”
ffffffff-ffff-ffff-ffff-ffffffffffffUUID maxim, definit în RFC 9562

Generarea UUID-urilor în cod

Majoritatea platformelor generează nativ UUID-uri v4, iar suportul pentru v7 se răspândește rapid în bibliotecile standard și în extensiile de baze de date. Când o platformă nu are v7, există biblioteci mici și bine întreținute care implementează RFC 9562; nu vă apucați singur de împachetat timestampul dacă nu îl testați față de exemplele din specificație. Orice ați folosi, asigurați-vă că partea aleatoare vine de la un generator sigur din punct de vedere criptografic. Surse rapide, dar previzibile, precum Math.random, nu sunt potrivite pentru așa ceva. Când alegeți o bibliotecă, verificați că scrie biții de versiune și de variantă conform specificației.

UUID-uri în medii obișnuite
// Browser and Node.js: v4
crypto.randomUUID()

# Python 3: v4 (uuid7 is available in newer versions)
python3 -c "import uuid; print(uuid.uuid4())"

-- PostgreSQL: v4 built in
SELECT gen_random_uuid();

Generați identificatorii acolo unde este creată înregistrarea, de obicei în aplicație, ca identificatorul să fie cunoscut înainte de inserarea în baza de date. Astfel puteți crea înregistrări legate, trimite evenimente și returna noul identificator clientului fără un drum dus-întors în plus. Aceeași abordare funcționează și pentru clienții offline, care se sincronizează mai târziu. Când o cerere reluată poartă același identificator, devine mai ușor și să faceți inserarea imună la duplicate. Generarea identificatorului în aplicație simplifică și testarea codului.

În sistemele distribuite, timestampul în milisecunde al unui UUID v7 vine de la ceasul fiecărei mașini. Valorile venite de la mașini cu ceasuri deviate se sortează tot aproximativ după timp, dar nu perfect, așa că nu vă bazați numai pe ordinea UUID-urilor pentru o ordonare strictă a evenimentelor. Dacă ordinea contează cu adevărat, scrieți lângă înregistrare un timestamp separat sau un număr de secvență. Menținerea sincronizării NTP pe servere ține abaterea la nivel de milisecunde. Ordinea valorilor generate în aceeași milisecundă depinde de partea aleatoare; RFC 9562 definește pentru asta un contor monoton opțional.

Stocarea UUID-urilor

Stocați UUID-urile într-un tip UUID nativ, acolo unde baza de date are unul, precum uuid în PostgreSQL, sau ca 16 octeți binari. Forma text de 36 de caractere ocupă mai mult decât dublul spațiului și face indexurile mai mari și mai lente. Convertiți la text doar la marginile sistemului, în API-uri și în jurnale. În bazele de date fără tip nativ, o coloană binară de lungime fixă e mai mică și mai rapidă decât una de caractere. Alegerea corectă a tipului de coloană de la început costă mult mai puțin decât o migrare ulterioară.

Tabel PostgreSQL cu o cheie UUID
CREATE TABLE orders (
  id uuid PRIMARY KEY,
  created_at timestamptz NOT NULL DEFAULT now(),
  customer_email text NOT NULL
);

-- application generates UUID v7 values, for example for an order from anna@example.com
  • Comparați UUID-urile în formă text fără să țineți cont de majuscule; RFC 9562 recomandă scrierea rezultatului cu litere mici.
  • Nu folosiți UUID-uri drept secrete. Valorile v4 sunt greu de ghicit, dar sunt proiectate ca identificatori, nu ca jetoane de acces.
  • Nu încercați să scoateți un înțeles din UUID-urile v4; doar versiunile v1, v6 și v7 poartă un timestamp.

Întrebări frecvente

Pot fi două UUID-uri identice?

În teorie da, în practică nu. UUID-urile v4 aleatoare au 122 de biți aleatori; chiar dacă ați genera miliarde pe secundă timp de mulți ani, șansa unei coliziuni ar rămâne neglijabilă.

Un GUID este același lucru cu un UUID?

Da. GUID este numele dat de Microsoft aceluiași format de identificator de 128 de biți.

Ar trebui să folosesc UUID v7 pentru chei primare?

De obicei da, în sistemele noi. Spre deosebire de cheile v4 aleatoare, valorile ordonate în timp păstrează indexurile compacte și inserările rapide.

Ce este un ULID?

Un identificator de 128 de biți cu un timestamp de 48 de biți în milisecunde și 80 de biți aleatori, scris cu 26 de caractere base32. Se sortează după timp și este mai scurt decât un UUID în formă text.

Pot afla momentul creării dintr-un UUID v4?

Nu. v4 este complet aleatoriu. Doar versiunile bazate pe timp, precum v1, v6 și v7, conțin un timestamp.

Sunt UUID-urile generate trimise către XGM?

Nu. Ele sunt generate în browserul dumneavoastră și nu sunt încărcate niciodată.

Majuscule sau litere mici?

Ambele reprezintă aceeași valoare. RFC 9562 recomandă literele mici la generare, iar comparațiile ar trebui să ignore diferența dintre majuscule și minuscule.

Poate fi folosit un UUID drept cheie de API?

Mai bine nu. Generați secretele cu un generator sigur de numere aleatoare și cu o lungime suficientă și tratați identificatorii și secretele ca lucruri diferite.

Câte UUID-uri pot genera deodată?

Generatorul creează loturi pentru date de test și pentru popularea inițială. Pentru volume foarte mari, generați-le în cod, unde aceeași sursă de numere aleatoare este disponibilă fără să copiați nimic dintr-o pagină.

De ce seamănă UUID-ul meu v7 cu cel anterior?

UUID-urile generate în aceeași milisecundă au primele 12 cifre hexazecimale comune, adică timestampul. Partea aleatoare de după cifra versiunii face totuși fiecare valoare unică.

Ce sunt versiunile 6 și 8?

Versiunea 6 rearanjează timestampul din v1 pentru sortare, iar versiunea 8 este un format liber, pentru aranjamente proprii. Ambele sunt definite în RFC 9562.

Surse