Generator UUID

Generează UUID-uri în browser: v4 complet aleator, v7 ordonat în timp pentru chei de baze de date, sau v5 determinist. Până la 1000 odată, fără a trimite nimic de pe dispozitiv.

Apasă Generează pentru a extrage
Versiune
Opțiuni avansate

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?

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ă.

FAQ

Cum generez un UUID?

Alege o versiune în „Versiune”, setează de câte ai nevoie în „Număr” și apasă pe „Generează”. Pagina se deschide cu un singur identificator versiunea 4, care este ceea ce doresc majoritatea proiectelor, deci un UUID obișnuit este la un clic distanță. Fiecare valoare apare cu propriul său buton de copiere, iar „Copiază tot” preia întregul lot deodată.

Care este diferența dintre UUID v4 și v7?

Versiunea 4 are 122 de biți aleatori fără nicio structură, așa că doi dintre ei nu au nicio relație unul cu celălalt. Versiunea 7 cheltuie primii 48 de biți pentru milisecunda în care a fost creat, adaugă un contor și 62 de biți aleatori și, prin urmare, se poate sorta: un lot iese în ordinea în care a fost făcut. Folosește v4 când un identificator trebuie doar să fie unic și v7 când va deveni și o cheie de bază de date.

Ce versiune de UUID ar trebui să folosesc?

Versiunea 4, excepție făcând cazul în care ai un motiv să alegi alta. Alege versiunea 7 dacă identificatorul devine o cheie primară și performanța inserării contează, versiunea 5 dacă ai nevoie ca aceleași date de intrare să producă întotdeauna același identificator, și versiunea 1 doar dacă un sistem cu care trebuie să comunici o cere în mod specific. Versiunea 3 este versiunea 5 cu MD5 în loc de SHA-1 și există pentru compatibilitate.

Sunt UUID-urile generate cu adevărat aleatoare și sigure?

Aleatorietatea este sigură din punct de vedere criptografic: provine din Web Crypto API al browserului tău, prin crypto.randomUUID() sau crypto.getRandomValues(), nu din Math.random(). Sigur în sensul de imprevizibil este o altă chestiune decât sigur în sensul de secret — un UUID este un identificator și nu ar trebui folosit ca parolă, token de sesiune sau cheie API.

Pot genera multe UUID-uri simultan?

Da, până la 1000 într-o singură mișcare. Setează „Număr” și apasă pe „Generează”; după cincizeci de valori, rezultatul devine un singur bloc derulabil, în loc de o listă lungă de rânduri. „Copiază tot” și „Salvează în fișier” iau întregul lot, unit așa cum indică „Format de copiere” — câte unul pe rând, separat prin virgule, sau cu ghilimele pentru a fi lipit într-un array.

De ce v3 și v5 îmi dau același UUID de fiecare dată?

Pentru că acesta este scopul lor. Versiunile 3 și 5 sunt deterministe: ele transformă spațiul de nume și numele pe care li-l dai într-un hash, așa că intrări identice produc întotdeauna un identificator identic, pe orice mașină și în orice limbaj. Acest lucru le face utile pentru obținerea unui identificator stabil din ceva ce ai deja, și acesta este și motivul pentru care „Număr” este ascuns atunci când le selectezi.

Ce sunt Spațiul de nume și Numele și ce spațiu de nume ar trebui să aleg?

Acestea sunt cele două date de intrare din care se calculează un UUID versiunea 3 sau versiunea 5. „Spațiu de nume” spune ce fel de lucru este numele — DNS pentru nume de hosturi, URL pentru adrese, OID și X.500 pentru acele scheme de directoare, sau „Personalizat” dacă vrei să furnizezi propriul tău UUID pentru spațiul de nume, care este alegerea obișnuită într-o aplicație. „Nume” este șirul în sine. Diferite spații de nume dau rezultate complet diferite pentru același nume, acesta fiind tocmai motivul pentru care există.

De ce UUID v7 este mai bun decât v4 pentru o cheie primară de bază de date?

Din cauza locului în care valorile ajung în index. Un index este ținut în ordine sortată, iar o cheie v4 aleatoare ajunge oriunde în el, deci inserările divid pagini în tot arborele, iar părțile ținute în memorie sunt rareori părțile necesare următoarei inserări. O cheie v7 începe cu milisecunda curentă, așa că inserările consecutive aterizează împreună la sfârșitul indexului, care este modul în care se comportă o cheie secvențială întreagă — permițând în continuare oricărui serviciu să emită un identificator fără a consulta un contor central.

Ar putea fi vreodată la fel două UUID-uri?

În principiu da, în practică nu, și merită știut diferența. Nimic nu verifică unicitatea: există pur și simplu 2^122 posibile valori de versiunea 4, cam 5,3 sextilioane, și ai avea nevoie de aproximativ 2,7 trilioane dintre ele — un miliard pe secundă timp de 86 de ani — înainte să existe șanse egale pentru o singură coliziune. Garanția este statistică, nu absolută, și depinde ca aleatorietatea să fie reală, acesta fiind motivul pentru care acest generator folosește Web Crypto API în loc de o funcție pseudo-aleatoare obișnuită.

Pot folosi un UUID ca parolă, cheie API sau token de sesiune?

Nu, iar aceasta este greșeala care costă cel mai mult. Un UUID versiunea 4 este imprevizibil, dar identificatorii sunt manipulați ca și cum ar fi publici: ei ajung în URL-uri, în istoricul browserului, în logurile serverului, în antetele referrer și în programe de analiză (analytics). Versiunile 1 și 7 dezvăluie suplimentar momentul în care au fost create, iar versiunile 3 și 5 pot fi recalculate de oricine cunoaște datele de intrare. Pentru orice trebuie să rămână secret, folosește un generator de parole sau un token dintr-o bibliotecă menită pentru secrete.

Dezvăluie UUID v7 când a fost creat?

Da, până la milisecundă, și acest lucru este intenționat, nu o scăpare — marcajul de timp este cel care face ca v7 să poată fi sortat. Rândul de sub rezultat îți arată timpul codat în prima valoare a lotului, astfel încât să poți vedea exact ce este expus. Versiunea 1 poartă și ea un marcaj de timp. Dacă momentul creării este ceva ce preferi să nu publici, versiunea 4 este versiunea care nu conține timp deloc.

Expune UUID v1 adresa MAC a mașinii mele?

Nu aici. Schema originală folosea adresa plăcii de rețea a mașinii drept câmpul node, de aici provine reputația lui v1, dar standardul permite de asemenea un identificator de nod aleator marcat cu bitul de multicast, iar asta este ceea ce produce acest generator. Adresa ta hardware nu este niciodată citită și nu apare niciodată în rezultat.

Ce modifică Majuscule, Fără cratime, Acolade și urn:uuid:?

Doar prezentarea — cei 128 de biți de dedesubt sunt identici în orice formă. „Majuscule” tipărește cifrele hexazecimale cu litere mari, „Fără cratime” oferă versiunea compactă de 32 de caractere, „Acolade” înfășoară valoarea în { } (așa cum scriu Windows și .NET un GUID), iar urn:uuid: adaugă prefixul care îl face un URN formal. urn:uuid: dezactivează pe celelalte două atâta timp cât este pornit, deoarece standardul definește exact o formă URN, iar aceasta este cea canonică cu cratime.