UUID Generator
Šta je UUID?
UUID (Universally Unique Identifier) je 128-bitni identifikator koji se koristi u računarskim sistemima za jedinstvenu identifikaciju informacija. UUID je standardizovan prema RFC 4122 i, zahvaljujući svojoj ogromnoj entropiji, garantuje praktično nultu verovatnoću kolizije – to znači da će dva nezavisno generisana UUID-a biti gotovo sigurno jedinstvena.
UUID ima standardni format: xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx, gde je svaki x heksadecimalna cifra (0-9, a-f), M označava verziju UUID-a, a N označava varijantu.
UUID Verzije
UUID v1 (Vremenska oznaka + MAC adresa)
UUID v1 je zasnovan na trenutnoj vremenskoj oznaci (timestamp) i nasumičnoj vrednosti (u pretraživaču umesto MAC adrese). Koristi intervale od 100 nanosekundi od 15. oktobra 1582. (Gregorijanski kalendar).
Upotreba:
- Situacije kada je potrebno hronološko sortiranje UUID-ova
- Debagovanje i logovanje (UUID sadrži informacije o vremenu kreiranja)
- Distribuirani sistemi sa vremenskom sinhronizacijom
Primer: 6ba7b810-9dad-11d1-80b4-00c04fd430c8
Prednosti:
- UUID-ovi se mogu hronološki sortirati prema vremenu kreiranja
- Korisno za reviziju i debagovanje
- Sadrži informaciju o vremenskoj oznaci
Nedostaci:
- Potencijalni bezbednosni rizik – sadrži vremensku oznaku
- U pretraživaču ne sadrži stvarnu MAC adresu (zamenjena nasumičnom vrednošću)
- Loša lokacija u bazi podataka (vremenska oznaka je u niskim bitovima)
UUID v3 (MD5 heš)
UUID v3 se generiše korišćenjem MD5 heša imenskog prostora UUID-a i imena. Deterministički – isti imenski prostor + ime uvek kreiraju isti UUID.
Upotreba:
- Konverzija URL-ova, DNS imena ili drugih identifikatora u UUID
- Situacije kada su vam potrebni reproduktivni UUID-ovi
- Mapiranje između različitih sistema identifikacije
Primer: a3bb189e-8bf9-3888-9912-ace4e6543002
Prednosti:
- Deterministički (isti ulaz = isti izlaz)
- Idealan za konverziju poznatih identifikatora
- Nema kolizije za različite ulaze
Nedostaci:
- MD5 je zastareli algoritam (preferirajte v5)
- Zahteva imenski prostor i ime
- Nije moguće povratiti originalni ulaz
UUID v4 (Nasumično) - PREPORUČENO
Najčešće korišćena verzija UUID-a. UUID v4 se generiše potpuno nasumično korišćenjem kriptografski sigurnog generatora nasumičnih brojeva (crypto.getRandomValues()).
Upotreba:
- Primarni ključevi baze podataka
- Identifikatori sesija (session IDs)
- Jedinstvena imena datoteka
- API tokeni
- Opšte namene, gde vam je potreban zagarantovano jedinstven ID
Primer: f47ac10b-58cc-4372-a567-0e02b2c3d479
Prednosti:
- Maksimalna entropija i bezbednost
- Nema zavisnosti od vremena ili sistemskih parametara
- Najjednostavnija implementacija
Verovatnoća kolizije: Prilikom generisanja 1 milijarde UUID-ova u sekundi tokom 100 godina, šansa za koliziju je približno 0.00000006%.
UUID v5 (SHA-1 heš)
UUID v5 je isti kao v3, ali koristi SHA-1 umesto MD5. Modernija i sigurnija alternativa v3.
Upotreba:
- Isto kao v3, ali sa boljom bezbednošću
- Preferira se u odnosu na v3 za nove projekte
- Generisanje UUID-a iz URL-ova, DNS imena, OID-a, X.500 DN-a
Primer: 886313e1-3b8a-5372-9b90-0c9aee199e5d
Prednosti:
- Deterministički
- SHA-1 je robusniji od MD5
- Pogodan za mapiranje između sistema
Nedostaci:
- SHA-1 se takođe smatra zastarelim (ali je i dalje sigurniji od MD5)
- Zahteva imenski prostor i ime
UUID v6 (Sortirana vremenska oznaka)
UUID v6 je poboljšana verzija v1 sa preuređenim vremenskim bitovima za bolje indeksiranje baze podataka. Dizajniran je za rešavanje problema lokacije u bazama podataka.
Upotreba:
- Primarni ključevi baze podataka sa vremenskim sortiranjem
- Sistemi koji zahtevaju hronološko sortiranje i performanse baze podataka
- Modernija alternativa v1
Primer: 1ec9414c-232a-6b00-b3c8-9e6bdeced846
Prednosti:
- Bolja lokacija u bazi podataka od v1 (vremenska oznaka u visokim bitovima)
- Hronološko sortiranje
- Kompatibilno sa UUID standardom
Nedostaci:
- Manje se koristi od v1/v4
- I dalje sadrži vremenske informacije (bezbednosni rizik)
UUID v7 (Unix vremenska oznaka)
UUID v7 koristi Unix vremensku oznaku (milisekunde od 1970) + nasumične bitove. Najnovija verzija UUID-a sa najboljom lokacijom u bazi podataka.
Upotreba:
- Moderni primarni ključevi baze podataka
- Sistemi koji zahtevaju performanse + vremensko sortiranje
- Zamena za v1/v6 u novim projektima
Primer: 017f22e2-79b0-7cc3-98c4-dc0c0c07398f
Prednosti:
- Najbolja lokacija u bazi podataka od svih verzija
- Unix vremenska oznaka je standardna
- Kombinuje prednosti nasumičnosti i vremenskog sortiranja
Nedostaci:
- Relativno nova specifikacija (RFC 4122bis)
- Manje podržana u starijim sistemima
Koju UUID verziju koristiti?
Vodič za odluku
Potrebna vam je maksimalna bezbednost i nasumičnost? → Koristite UUID v4 (najčešći izbor)
Potrebno vam je vremensko sortiranje i performanse baze podataka? → Koristite UUID v7 (moderno) ili UUID v6 (standardno)
Potrebni su vam reproduktivni UUID-ovi iz postojećih identifikatora? → Koristite UUID v5 (SHA-1) ili UUID v3 (MD5, zastarelo)
Potrebna vam je vremenska oznaka i trag revizije? → Koristite UUID v1 (zastarelo, lošije performanse baze podataka)
Baze podataka
Za nove projekte: UUID v7 ili v4
- v7 je idealan za vremensko sortiranje + performanse
- v4 za maksimalnu nasumičnost bez vremenskih informacija
Za starije sisteme: UUID v1 ili v6
- v6 ima bolju lokaciju u bazi podataka od v1
- v1 je široko podržan
Prednosti UUID-a kao primarnog ključa:
- Globalna jedinstvenost – Možete povezivati podatke iz različitih baza podataka bez konflikta
- Bezbednost – Za razliku od sekvencijalnih ID-ova (1, 2, 3…), sledeće vrednosti se ne mogu pogoditi
- Distribuirani sistemi – UUID-ovi se mogu generisati nezavisno na više servera bez koordinacije
- Spajanje baza podataka – Prilikom spajanja dve baze podataka ne dolazi do konflikta
Nedostaci:
- Veća veličina (16 bajtova nasuprot 4-8 bajtova za integer)
- Sporije indeksiranje u nekim bazama podataka (koristite v6/v7 za bolje performanse)
- Manje čitljivo za čoveka
API i veb servisi
- REST API – Jedinstveni identifikatori za resurse
- GraphQL – Globalni identifikatori za čvorove
- Webhookovi – Praćenje zahteva i odgovora
- Tokeni – ID-ovi sesija, tokeni za osvežavanje
Fajlovi i skladištenje
- Imena datoteka – Sprečavanje kolizija prilikom otpremanja
- S3/Cloud Storage – Jedinstvene putanje do objekata
- Keš ključevi – Identifikatori u keš sistemima
Frontend aplikacije
- React/Vue komponente – Jedinstveni ključevi za liste
- Privremeni ID-ovi – ID-ovi pre čuvanja u bazu podataka
- Lokalno skladištenje – Ključevi za sačuvane podatke
- Offline-first aplikacije – Generisanje ID-ova bez povezivanja sa serverom
Napredne funkcije generatora
Generisanje UUID-a sa prilagođenim vremenom
Za verzije zasnovane na vremenu (v1, v6, v7) možete odabrati bilo koju vremensku oznaku pomoću date-time pickera. Ovo je korisno za:
Testiranje:
- Simulacija UUID-ova kreiranih u prošlosti
- Testiranje vremenskog sortiranja u bazama podataka
- Reprodukcija UUID-ova za debagovanje
Migracija podataka:
- Generisanje UUID-ova sa istorijskim vremenskim oznakama
- Popunjavanje podataka sa ispravnim timestamp vrednostima
- Uvoz podataka iz različitih vremenskih perioda
Revizija i usklađenost:
- Rekonstrukcija UUID-ova prema vremenu nastanka zapisa
- Retroaktivno generisanje identifikatora
Primer upotrebe:
- Izaberite verziju v1, v6 ili v7
- Podesite datum i vreme pomoću date-time pickera
- Generišite UUID sa vašom prilagođenom vremenskom oznakom
Heš-bazirani UUID (v3, v5)
Za determinističke UUID-ove možete koristiti verzije v3 (MD5) ili v5 (SHA-1):
Kako koristiti:
- Izaberite imenski prostor prema tipu vašeg identifikatora
- Unesite naziv/vrednost
- Generišite UUID
Primeri:
| Imenski prostor | Naziv (unos) | Upotreba |
|---|---|---|
| DNS | example.com | Konverzija imena domena u UUID |
| DNS | google.com | Svaki veb sajt ima jedinstven UUID |
| URL | https://example.com/page | Konverzija URL-a u UUID |
| URL | https://api.example.com/users/123 | API endpoint kao UUID |
| OID | 1.3.6.1.4.1.343 | Object Identifier u UUID |
| X.500 | CN=John Doe,O=Company | Distinguished Name u UUID |
Važne karakteristike:
- ✅ Deterministički: Isti ulaz = uvek isti UUID
- ✅ Reproduktivni: Možete ponovo kreirati UUID bilo kada
- ✅ Konzistentni: Isti UUID u različitim sistemima
- ❌ Nije moguće dekodirati: Iz UUID-a nije moguće dobiti originalni naziv nazad
- ℹ️ Jedan UUID: Za v3/v5 se uvek generiše samo jedan UUID (isti ulaz = isti izlaz)
Praktična upotreba:
// Primer: Konverzija URL-a u UUID v5
Namespace: URL
Naziv: https://example.com/api/users/123
Rezultat: 886313e1-3b8a-5372-9b90-0c9aee199e5d
// Isti ulaz = uvek isti UUID
Namespace: DNS
Naziv: google.com
Rezultat: uvek isti UUID za google.com
Kako bezbedno koristiti UUID?
Kriptografska bezbednost
Naš generator koristi crypto.getRandomValues(), što je kriptografski siguran generator nasumičnih brojeva. Za razliku od Math.random(), koji je predvidljiv i nepogodan za bezbednosne svrhe, crypto.getRandomValues() pruža pravu entropiju pogodnu za:
- Generisanje bezbednosnih tokena
- ID-ove sesija
- API ključeve
- Kriptografske aplikacije
Poređenje UUID verzija
| Verzija | Osnova | Kolizija | Vremensko sortiranje | Performanse DB | Upotreba |
|---|---|---|---|---|---|
| v1 | Vremenska oznaka + MAC | Niska | ✅ Da | ❌ Lošije | Zastarelo, revizija |
| v3 | MD5 heš | Nema (determinističko) | ❌ Ne | ⚠️ Srednje | Konverzije (zastarelo) |
| v4 | Nasumično | Izuzetno niska | ❌ Ne | ⚠️ Srednje | Opšta upotreba |
| v5 | SHA-1 heš | Nema (determinističko) | ❌ Ne | ⚠️ Srednje | Konverzije (preporučeno) |
| v6 | Sortirana vremenska oznaka | Niska | ✅ Da | ✅ Bolje | Moderne DB sa vremenom |
| v7 | Unix vremenska oznaka | Niska | ✅ Da | ✅ Najbolje | Novi projekti |
UUID nasuprot drugim identifikatorima
| Tip | Veličina | Kolizija | Vremensko sortiranje | Upotreba |
|---|---|---|---|---|
| Auto-increment ID | 4-8 bajtova | Garantovano jedinstveno unutar tabele | ❌ | Jednostavne aplikacije, lokalne DB |
| UUID v4 | 16 bajtova | Praktično nemoguća | ❌ | Distribuirani sistemi, API |
| UUID v7 | 16 bajtova | Praktično nemoguća | ✅ | Moderne DB sa performansama |
| ULID | 16 bajtova | Praktično nemoguća | ✅ | UUID + leksikografsko sortiranje |
| Snowflake ID | 8 bajtova | Garantovano jedinstveno uz pravilnu konfiguraciju | ✅ | Twitter, distribuirani sistemi |
| NanoID | Konfigurabilna | Zavisi od dužine | ❌ | URL-friendly ID-ovi |
Implementacija u različitim jezicima
JavaScript/TypeScript
// UUID v4 - Najjednostavniji način (moderni pretraživači)
const uuid = crypto.randomUUID();
// UUID v4 - Ručna implementacija
function generateUUIDv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
const r = (crypto.getRandomValues(new Uint8Array(1))[0] & 0x0f) >> (c === 'x' ? 0 : 2);
const v = c === 'x' ? r : (r & 0x3) | 0x8;
return v.toString(16);
});
}
// UUID v7 - Preporučeno za baze podataka
function generateUUIDv7() {
const timestamp = Date.now();
const timeHi = (timestamp >> 16).toString(16).padStart(8, '0');
const timeLow = (timestamp & 0xFFFF).toString(16).padStart(4, '0');
const randomBytes = crypto.getRandomValues(new Uint8Array(10));
const randomHex = Array.from(randomBytes)
.map(b => b.toString(16).padStart(2, '0'))
.join('');
return `${timeHi}-${timeLow}-7${randomHex.substr(0, 3)}-${randomHex.substr(3, 4)}-${randomHex.substr(7)}`;
}
Python
import uuid
# UUID v4
uuid_v4 = str(uuid.uuid4())
# Output: '6ba7b810-9dad-11d1-80b4-00c04fd430c8'
# UUID v1
uuid_v1 = str(uuid.uuid1())
Java
import java.util.UUID;
// UUID v4
String uuidV4 = UUID.randomUUID().toString();
PHP
// UUID v4 (PHP 7+)
function generateUUID() {
return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
mt_rand(0, 0xffff), mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
mt_rand(0, 0x0fff) | 0x4000,
mt_rand(0, 0x3fff) | 0x8000,
mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
);
}
C#
using System;
// UUID v4
Guid uuid = Guid.NewGuid();
string uuidString = uuid.ToString();
Najbolje prakse
Čuvanje UUID-a u bazi podataka
PostgreSQL:
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
MySQL 8.0+:
CREATE TABLE users (
id BINARY(16) PRIMARY KEY DEFAULT (UUID_TO_BIN(UUID())),
email VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Savet: U MySQL-u čuvajte UUID kao BINARY(16) umesto CHAR(36) radi uštede prostora i bržeg indeksiranja.
Validacija UUID-a
function isValidUUID(uuid) {
const regex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
return regex.test(uuid);
}
Konverzija UUID-a
// Uklanjanje crtica
const compact = uuid.replace(/-/g, '');
// Dodavanje crtica nazad
function formatUUID(compactUuid) {
return [
compactUuid.substring(0, 8),
compactUuid.substring(8, 12),
compactUuid.substring(12, 16),
compactUuid.substring(16, 20),
compactUuid.substring(20, 32)
].join('-');
}
Rešavanje problema (Troubleshooting)
UUID v3/v5 ne radi
Problem: Nakon odabira v3 ili v5, ništa se ne generiše
Rešenje:
- ✅ Proverite da ste popunili polje “Naziv” - obavezno je!
- ✅ Izaberite ispravan imenski prostor prema tipu vašeg unosa
- ✅ Primeri validnih unosa:
- DNS:
example.com,google.com - URL:
https://example.com/page - Bilo koji tekst:
moja-aplikacija-v1
- DNS:
Savet: Pokušajte prvo sa jednostavnom vrednošću kao što je test i imenski prostor DNS.
Vremenski UUID (v1, v6, v7) ima čudno vreme
Problem: Generisani UUID ima neočekivani timestamp
Rešenje:
- ✅ Proverite date-time picker - da li je podešeno ispravno vreme?
- ✅ Date-time picker koristi vašu lokalnu vremensku zonu
- ✅ Ostavite date-time picker praznim za trenutno vreme
UUID se ne može kopirati
Problem: Dugme “Kopiraj sve” ne radi
Rešenje:
- ✅ Proverite da ste generisali UUID (nisu prazni)
- ✅ Neki pretraživači zahtevaju HTTPS za clipboard API
- ✅ Alternativno, odaberite tekst u textarea i kopirajte ručno (Ctrl+C)
Česta pitanja (FAQ)
Može li doći do kolizije UUID-a?
Teoretski da, ali verovatnoća je astronomski mala. Prilikom generisanja 1 milijarde UUID v4 u sekundi tokom 100 godina, šansa za koliziju je približno 0.00000006%. U praksi se kolizija nikada neće dogoditi.Da li je UUID pogodan kao primarni ključ u bazi podataka?
Zavisi od slučaja upotrebe. UUID je idealan za distribuirane sisteme i situacije kada vam je potrebna globalna jedinstvenost. Za jednostavne aplikacije sa jednom bazom podataka, auto-increment može biti efikasniji.Jesu li UUID-ovi generisani ovim alatom bezbedni?
Da, koristimo Web Crypto API (`crypto.getRandomValues()`), koje pruža kriptografski sigurne nasumične vrednosti. Sve se dešava lokalno u vašem pretraživaču.Koja je razlika između UUID verzija?
- **v1**: Vremenska oznaka + MAC/nasumično - hronološko sortiranje, lošije performanse baze podataka - **v3/v5**: Heš-bazirano - determinističko, za konverziju poznatih identifikatora - **v4**: Nasumično - najsigurnije, najčešće korišćeno - **v6**: Preuređena vremenska oznaka - bolje performanse baze podataka od v1 - **v7**: Unix vremenska oznaka - najbolje performanse baze podataka + vremensko sortiranjeKoju verziju UUID-a bih trebao koristiti?
Za većinu slučajeva koristite **v4** (nasumično). Za baze podataka sa vremenskim sortiranjem koristite **v7** (moderno) ili **v6** (standardno). Za konverziju poznatih identifikatora (URL, DNS) koristite **v5** (SHA-1).Mogu li koristiti UUID za tokene i API ključeve?
UUID v4 je pogodan za ID-ove sesija i slične tokene. Za API ključeve razmislite o korišćenju dužih nasumičnih stringova (npr. 256-bitne vrednosti) ili specijalizovanih biblioteka.Koliko su veliki UUID-ovi?
UUID ima 128 bitova (16 bajtova). U string formatu sa crticama zauzima 36 znakova. Bez crtica 32 heksadecimalna znaka.Alternative za UUID
ULID (Universally Unique Lexicographically Sortable Identifier)
- 128-bitni ID (isto kao UUID)
- Leksikografski se može sortirati prema vremenu kreiranja
- Kompaktnija reprezentacija (26 znakova umesto 36)
- Base32 kodiranje neosetljivo na velika i mala slova
Primer: 01ARZ3NDEKTSV4RRFFQ69G5FAV
NanoID
- Manja veličina od UUID-a (standardno 21 znak)
- URL-friendly (bez specijalnih znakova)
- Brže generisanje
- Konfigurabilna dužina i abeceda
Primer: V1StGXR8_Z5jdHi6B-myT
Snowflake ID (Twitter)
- 64-bitni ID (manji od UUID-a)
- Vremenski se može sortirati
- Sadrži ID radnika i redni broj
- Zahteva centralizovanu konfiguraciju
Primer: 1234567890123456789
Performanse i optimizacija
Brzina generisanja
Naš generator može generisati:
- 1 UUID: < 1 ms
- 100 UUID: ~10-20 ms
- 1000 UUID: ~100-200 ms
Saveti za performanse
- Grupno generisanje – Ako vam je potrebno mnogo UUID-ova, generišite ih odjednom umesto jedan po jedan
- Čuvanje u DB – Indeksirajte UUID kolone za brzo pretraživanje
- Kompresija – Čuvajte UUID u binarnom obliku (16 bajtova) umesto stringa (36 bajtova)
- Keširanje – U nekim slučajevima možete pregenerisati i keširati UUID-ove
Za programere
Struktura UUID v4
xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
| | | | |
| | | | └─ 48 bitova nasumičnih podataka (čvor)
| | | └────── 16 bitova nasumičnih podataka sa varijantom (clock_seq)
| | └─────────── 12 bitova nasumičnih podataka + 4 bita verzije (time_hi_and_version)
| └──────────────── 16 bitova nasumičnih podataka (time_mid)
└───────────────────────── 32 bita nasumičnih podataka (time_low)
- Verzija (4 bita): uvek
0100(binarno) =4(heksadecimalno) - Varijanta (2-3 bita): uvek
10(binarno) za RFC 4122
Testiranje UUID-a
// Jest test
describe('UUID Generator', () => {
test('generates valid UUID v4', () => {
const uuid = generateUUIDv4();
const regex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
expect(regex.test(uuid)).toBe(true);
});
test('generates unique UUIDs', () => {
const uuid1 = generateUUIDv4();
const uuid2 = generateUUIDv4();
expect(uuid1).not.toBe(uuid2);
});
});
Bezbednosni aspekti
Šta ne raditi sa UUID-om
❌ Ne koristite UUID v1 za osetljive aplikacije – Sadrži vremensku oznaku, što može biti bezbednosni rizik
❌ Ne koristite Math.random() za generisanje UUID-ova – Nije kriptografski sigurno
❌ Ne oslanjajte se na UUID za autorizaciju – UUID se može pogoditi (iako sa izuzetno malom verovatnoćom)
❌ Ne čuvajte UUID u kolačićima bez šifrovanja – Koristite potpisane kolačiće ili JWT
Šta raditi
✅ Koristite UUID v4 za većinu slučajeva – Najveća entropija i bezbednost
✅ Kombinujte UUID sa drugim bezbednosnim merama – Za upravljanje sesijama koristite HTTPS, HttpOnly kolačiće i kratak period isteka
✅ Validirajte UUID na serveru – Uvek proverite format i verziju UUID-a
✅ Koristite kriptografski sigurne izvore nasumičnosti – crypto.getRandomValues() u pretraživaču, /dev/urandom na Linuxu
Zanimljivosti
- Broj mogućih UUID v4: 2^122 ≈ 5.3 × 10^36 (340 undeciliona)
- Potrebna kolizija: Za 50% šanse za koliziju morate generisati 2.71 × 10^18 UUID-ova (2.71 kvintiliona)
- Veličina svih mogućih UUID-ova: Kada bismo svaki UUID sačuvali kao 16 bajtova, ceo prostor bi zauzeo 85 zetabajta (85 milijardi terabajta)
- Poreklo: UUID je standardizovan kao deo DCE (Distributed Computing Environment) 1990. godine