Generator UUID | Ustvari edinstvene ID-je (v1-v7) brezplačno

Kaj je UUID?

UUID (Universally Unique Identifier) je 128-bitni identifikator, ki se uporablja v računalniških sistemih za edinstveno identifikacijo informacij. UUID je standardiziran v skladu z RFC 4122 in zaradi svoje ogromne entropije zagotavlja praktično nično verjetnost kolizije – to pomeni, da bosta dva neodvisno generirana UUID-ja skoraj zagotovo unikatna.

UUID ima standardno obliko: xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx, kjer je vsak x heksadecimalna številka (0-9, a-f), M označuje različico UUID in N označuje varianto.

Različice UUID

UUID v1 (Časovni žig + MAC naslov)

UUID v1 je zasnovan na trenutnem časovnem žigu (timestamp) in naključni vrednosti (v brskalniku namesto naslova MAC). Uporablja 100-nanosekundne intervale od 15. oktobra 1582 (Gregorijanski koledar).

Uporaba:

  • Situacije, ko potrebujete kronološko razvrščanje UUID-jev
  • Razhroščevanje in beleženje (UUID vsebuje informacije o času ustvarjanja)
  • Distribuirani sistemi s časovno sinhronizacijo

Primer: 6ba7b810-9dad-11d1-80b4-00c04fd430c8

Prednosti:

  • UUID-je je mogoče kronološko razvrščati po času ustvarjanja
  • Uporabno za revizijo in razhroščevanje
  • Vsebuje informacije o časovnem žigu

Slabosti:

  • Potencialno varnostno tveganje – vsebuje časovni žig
  • V brskalniku ne vsebuje dejanskega naslova MAC (nadomeščen z naključno vrednostjo)
  • Slaba lokacija PB (časovni žig je v nizko-vrstnih bitih)

UUID v3 (MD5 zgoščena vrednost)

UUID v3 se generira z uporabo MD5 zgoščene vrednosti imenskega prostora UUID in imena. Deterministicno – isti imenski prostor + ime vedno ustvarita isti UUID.

Uporaba:

  • Pretvorba URL-jev, imen DNS ali drugih identifikatorjev v UUID
  • Situacije, ko potrebujete ponovljivo UUID
  • Preslikava med različnimi identifikacijskimi sistemi

Primer: a3bb189e-8bf9-3888-9912-ace4e6543002

Prednosti:

  • Deterministicno (enak vnos = enak izhod)
  • Idealno za pretvorbo znanih identifikatorjev
  • Brez kolizij za različne vnose

Slabosti:

  • MD5 je zastarel algoritem (raje uporabite v5)
  • Zahteva imenski prostor in ime
  • Prvotnega vnosa ni mogoče pridobiti nazaj

UUID v4 (Naključno) - PRIPOROČENO

Najpogosteje uporabljena različica UUID. UUID v4 se generira izključno naključno z uporabo kriptografsko varnega generatorja naključnih števil (crypto.getRandomValues()).

Uporaba:

  • Primarni ključi podatkovnih baz
  • Identifikatorji sej (session IDs)
  • Edinstvena imena datotek
  • API žetoni
  • Splošni nameni, kjer potrebujete zagotovljeno edinstven ID

Primer: f47ac10b-58cc-4372-a567-0e02b2c3d479

Prednosti:

  • Maksimalna entropija in varnost
  • Brez odvisnosti od časa ali sistemskih parametrov
  • Najenostavnejša implementacija

Verjetnost kolizije: Pri generiranju 1 milijarde UUID-jev na sekundo v obdobju 100 let je verjetnost kolizije približno 0,00000006%.

UUID v5 (SHA-1 zgoščena vrednost)

UUID v5 je enak kot v3, vendar uporablja SHA-1 namesto MD5. Modernejša in varnejša alternativa v3.

Uporaba:

  • Enako kot v3, vendar z boljšo varnostjo
  • Prednost pred v3 za nove projekte
  • Generiranje UUID-jev iz URL-jev, imen DNS, OID, X.500 DN

Primer: 886313e1-3b8a-5372-9b90-0c9aee199e5d

Prednosti:

  • Deterministicno
  • SHA-1 je robustnejši od MD5
  • Primerno za preslikavo med sistemi

Slabosti:

  • SHA-1 prav tako velja za zastarelo (vendar še vedno varnejše od MD5)
  • Zahteva imenski prostor in ime

UUID v6 (Urejen časovni žig)

UUID v6 je izboljšana različica v1 s preurejenimi časovnimi biti za boljše indeksiranje v podatkovnih bazah. Zasnovano za reševanje problemov z lokalnostjo v podatkovnih bazah.

Uporaba:

  • Primarni ključi podatkovnih baz s časovnim razvrščanjem
  • Sistemi, ki zahtevajo kronološko razvrščanje in zmogljivost PB
  • Modernejša alternativa v1

Primer: 1ec9414c-232a-6b00-b3c8-9e6bdeced846

Prednosti:

  • Boljša lokacija PB kot v1 (časovni žig v visoko-vrstnih bitih)
  • Kronološko razvrščanje
  • Združljivo s standardom UUID

Slabosti:

  • Manj uporabljano kot v1/v4
  • Še vedno vsebuje časovne informacije (varnostno tveganje)

UUID v7 (Unix časovni žig)

UUID v7 uporablja Unix časovni žig (milisekunde od leta 1970) + naključne bite. Najnovejša različica UUID z najboljšo lokacijo PB.

Uporaba:

  • Sodobni primarni ključi podatkovnih baz
  • Sistemi, ki zahtevajo zmogljivost + časovno razvrščanje
  • Nadomestek za v1/v6 v novih projektih

Primer: 017f22e2-79b0-7cc3-98c4-dc0c0c07398f

Prednosti:

  • Najboljša lokacija PB med vsemi različicami
  • Unix časovni žig je standarden
  • Združuje prednosti naključnosti in časovnega razvrščanja

Slabosti:

  • Relativno nova specifikacija (RFC 4122bis)
  • Manj podprta v starejših sistemih

Katero različico UUID uporabiti?

Vodnik za odločanje

Potrebujete maksimalno varnost in naključnost? → Uporabite UUID v4 (najpogostejša izbira)

Potrebujete časovno razvrščanje in zmogljivost PB? → Uporabite UUID v7 (sodoben) ali UUID v6 (standarden)

Potrebujete ponovljiv UUID iz obstoječih identifikatorjev? → Uporabite UUID v5 (SHA-1) ali UUID v3 (MD5, starejši)

Potrebujete časovni žig in revizijsko sled? → Uporabite UUID v1 (starejši, slabša zmogljivost PB)

Podatkovne baze

Za nove projekte: UUID v7 ali v4

  • v7 je idealen za časovno razvrščanje + zmogljivost
  • v4 za maksimalno naključnost brez časovnih informacij

Za starejše sisteme: UUID v1 ali v6

  • v6 ima boljšo lokacijo PB kot v1
  • v1 je široko podprt

Prednosti UUID kot primarnega ključa:

  • Globalna edinstvenost – Podatke iz različnih podatkovnih baz lahko združite brez konflikta
  • Varnost – Za razliko od zaporednih ID-jev (1, 2, 3…) ni mogoče ugibati naslednjih vrednosti
  • Distribuirani sistemi – UUID-je je mogoče generirati neodvisno na več strežnikih brez koordinacije
  • Združevanje podatkovnih baz – Pri združitvi dveh podatkovnih baz ne pride do konfliktov

Slabosti:

  • Večja velikost (16 bajtov proti 4-8 bajtom za celo število)
  • Počasnejše indeksiranje v nekaterih podatkovnih bazah (za boljšo zmogljivost uporabite v6/v7)
  • Manj berljivo za človeka

API in spletne storitve

  • REST API – Edinstveni identifikatorji za vire
  • GraphQL – Globalni identifikatorji za vozlišča
  • Webhooki – Sledenje zahtevam in odgovorom
  • Žetoni – ID-ji sej, žetoni za osvežitev

Datoteke in shranjevanje

  • Imena datotek – Preprečevanje kolizij pri nalaganju
  • S3/Cloud Storage – Edinstvene poti do objektov
  • Ključi predpomnilnika – Identifikatorji v sistemih predpomnilnika

Frontend aplikacije

  • React/Vue komponente – Edinstveni ključi za sezname
  • Začasni ID-ji – ID-ji pred shranjevanjem v podatkovno bazo
  • Lokalno shranjevanje – Ključi za shranjene podatke
  • Aplikacije, ki delujejo najprej brez povezave – Generiranje ID-jev brez povezave s strežnikom

Napredne funkcije generatorja

Generiranje UUID z lastnim časom

Za časovno zasnovane različice (v1, v6, v7) lahko izberete poljuben časovni žig z uporabo izbirnika datuma in časa. To je uporabno za:

Testiranje:

  • Simulacija UUID-jev, ustvarjenih v preteklosti
  • Testiranje časovnega razvrščanja v podatkovnih bazah
  • Reprodukcija UUID-jev za razhroščevanje

Migracija podatkov:

  • Generiranje UUID-jev z zgodovinskimi časovnimi žigi
  • Dopunjavanje podatkov s pravilnimi vrednostmi časovnih žigov
  • Uvoz podatkov iz različnih časovnih obdobij

Revizija in skladnost:

  • Rekonstrukcija UUID-jev glede na čas nastanka zapisa
  • Retroaktivno generiranje identifikatorjev

Primer uporabe:

  1. Izberite različico v1, v6 ali v7
  2. Nastavite datum in čas z uporabo izbirnika datuma in časa
  3. Ustvarite UUID z lastnim časovnim žigom

UUID na osnovi zgoščene vrednosti (v3, v5)

Za deterministične UUID lahko uporabite različici v3 (MD5) ali v5 (SHA-1):

Kako uporabiti:

  1. Izberite imenski prostor glede na vrsto vašega identifikatorja
  2. Vnesite ime/vrednost
  3. Ustvarite UUID

Primeri:

Imenski prostorIme (vnos)Uporaba
DNSexample.comPretvorba imena domene v UUID
DNSgoogle.comVsako spletno mesto ima edinstven UUID
URLhttps://example.com/pagePretvorba URL v UUID
URLhttps://api.example.com/users/123Končna točka API kot UUID
OID1.3.6.1.4.1.343Objektni identifikator v UUID
X.500CN=John Doe,O=CompanyRazlikovalno ime v UUID

Pomembne lastnosti:

  • Deterministično: Enak vnos = vedno enak UUID
  • Ponovljivo: UUID lahko kadar koli znova ustvarite
  • Konsistentno: Enak UUID v različnih sistemih
  • Ni mogoče dekodirati: Iz UUID ni mogoče pridobiti prvotnega imena
  • ℹ️ En UUID: Za v3/v5 se vedno generira samo en UUID (enak vnos = enak izhod)

Praktična uporaba:

// Primer: Pretvorba URL v UUID v5
Namespace: URL
Ime: https://example.com/api/users/123
Rezultat: 886313e1-3b8a-5372-9b90-0c9aee199e5d

// Enak vnos = vedno enak UUID
Namespace: DNS
Ime: google.com
Rezultat: vedno enak UUID za google.com

Kako varno uporabljati UUID?

Kriptografska varnost

Naš generator uporablja crypto.getRandomValues(), ki je kriptografsko varen generator naključnih števil. Za razliko od Math.random(), ki je predvidljiv in neprimeren za varnostne namene, crypto.getRandomValues() zagotavlja resnično entropijo, primerno za:

  • Generiranje varnostnih žetonov
  • ID-ji sej
  • API ključi
  • Kriptografske aplikacije

Primerjava različic UUID

RazličicaOsnovaKolizijeČasovno razvrščanjeZmogljivost PBUporaba
v1Časovni žig + MACNizka✅ Da❌ SlabšeStarejši, revizija
v3MD5 zgoščena vrednostNi (deterministicno)❌ Ne⚠️ SrednjaPretvorbe (starejši)
v4NaključnoIzjemno nizka❌ Ne⚠️ SrednjaSplošna uporaba
v5SHA-1 zgoščena vrednostNi (deterministicno)❌ Ne⚠️ SrednjaPretvorbe (priporočeno)
v6Urejen časovni žigNizka✅ Da✅ BoljšeSodobna PB s časom
v7Unix časovni žigNizka✅ Da✅ NajboljšeNovi projekti

UUID proti drugim identifikatorjem

VrstaVelikostKolizijeČasovno razvrščanjeUporaba
Auto-increment ID4-8 bajtovZagotovljeno edinstven znotraj tabeleEnostavne aplikacije, lokalna PB
UUID v416 bajtovPraktično nemogočaDistribuirani sistemi, API
UUID v716 bajtovPraktično nemogočaSodobna PB z zmogljivostjo
ULID16 bajtovPraktično nemogočaUUID + leksikografsko razvrščanje
Snowflake ID8 bajtovZagotovljeno edinstven ob pravilni konfiguracijiTwitter, distribuirani sistemi
NanoIDNastavljivaOdvisno od dolžineURL-prijazni ID-ji

Implementacija v različnih jezikih

JavaScript/TypeScript

// UUID v4 - Najenostavnejši način (sodobni brskalniki)
const uuid = crypto.randomUUID();

// UUID v4 - Roč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 - Priporočeno za podatkovne baze
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())
# Izhod: '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();

Najboljše prakse

Shranjevanje UUID v podatkovni bazi

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
);

Nasvet: V MySQL shranite UUID kot BINARY(16) namesto CHAR(36) za prihranek prostora in hitrejše indeksiranje.

Validacija UUID

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);
}

Pretvorba UUID

// Odstranjevanje pomišljajev
const compact = uuid.replace(/-/g, '');

// Dodajanje pomišljajev nazaj
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ševanje težav (Odpravljanje napak)

UUID v3/v5 ne deluje

Problem: Po izbiri v3 ali v5 se nič ne generira

Rešitev:

  1. ✅ Preverite, da ste izpolnili polje “Ime” - je obvezno!
  2. ✅ Izberite pravilen imenski prostor glede na vrsto vašega vnosa
  3. ✅ Primeri veljavnih vnosov:
    • DNS: example.com, google.com
    • URL: https://example.com/page
    • Kakršno koli besedilo: moja-aplikacija-v1

Nasvet: Najprej poskusite z enostavno vrednostjo, kot je test, in imenskim prostorom DNS.

Časovni UUID (v1, v6, v7) ima čuden čas

Problem: Generiran UUID ima nepričakovan časovni žig

Rešitev:

  1. ✅ Preverite izbirnik datuma in časa - ali je nastavljen pravilen čas?
  2. ✅ Izbirnik datuma in časa uporablja vaš lokalni časovni pas
  3. ✅ Pustite izbirnik datuma in časa prazen za trenutni čas

UUID ni mogoče kopirati

Problem: Gumb “Kopiraj vse” ne deluje

Rešitev:

  1. ✅ Preverite, ali ste generirali UUID-je (ali niso prazni)
  2. ✅ Nekateri brskalniki zahtevajo HTTPS za API odložišča
  3. ✅ Alternativno izberite besedilo v tekstovnem polju in ga ročno kopirajte (Ctrl+C)

Pogosto zastavljena vprašanja (FAQ)

Ali lahko pride do kolizije UUID? Teoretično da, vendar je verjetnost astronomsko majhna. Pri generiranju 1 milijarde UUID v4 na sekundo v obdobju 100 let je verjetnost kolizije približno 0,00000006%. V praksi do kolizije nikoli ne pride.
Ali je UUID primeren kot primarni ključ v podatkovni bazi? Odvisno od primera uporabe. UUID je idealen za distribuirane sisteme in situacije, ko potrebujete globalno edinstvenost. Za preproste aplikacije z eno podatkovno bazo je lahko avtomatsko povečevanje učinkovitejše.
Ali so UUID-ji, ustvarjeni s tem orodjem, varni? Da, uporabljamo Web Crypto API (`crypto.getRandomValues()`), ki zagotavlja kriptografsko varne naključne vrednosti. Vse se dogaja lokalno v vašem brskalniku.
Kakšna je razlika med različicami UUID? - **v1**: Časovni žig + MAC/naključno - kronološko razvrščanje, slabša zmogljivost PB - **v3/v5**: Na osnovi zgoščene vrednosti - deterministično, za pretvorbo znanih identifikatorjev - **v4**: Naključno - najvarnejše, najpogosteje uporabljeno - **v6**: Preurejen časovni žig - boljša zmogljivost PB kot v1 - **v7**: Unix časovni žig - najboljša zmogljivost PB + časovno razvrščanje
Katero različico UUID naj uporabim? Za večino primerov uporabite **v4** (naključno). Za podatkovne baze s časovnim razvrščanjem uporabite **v7** (sodoben) ali **v6** (standarden). Za pretvorbo znanih identifikatorjev (URL, DNS) uporabite **v5** (SHA-1).
Ali lahko uporabim UUID za žetone in ključe API? UUID v4 je primeren za ID-je sej in podobne žetone. Za ključe API razmislite o uporabi daljših naključnih nizov (npr. 256-bitne vrednosti) ali specializiranih knjižnic.
Kako veliki so UUID-ji? UUID ima 128 bitov (16 bajtov). V formatu niza s pomišljaji zavzame 36 znakov. Brez pomišljajev 32 heksadecimalnih znakov.

Alternative UUID

ULID (Universally Unique Lexicographically Sortable Identifier)

  • 128-bitni ID (enako kot UUID)
  • Leksikografsko razvrstljiv po času ustvarjanja
  • Bolj kompaktna predstavitev (26 znakov namesto 36)
  • Kodiranje base32, ki ne razlikuje velikih in malih črk

Primer: 01ARZ3NDEKTSV4RRFFQ69G5FAV

NanoID

  • Manjša velikost kot UUID (standardno 21 znakov)
  • URL-prijazno (brez posebnih znakov)
  • Hitrejše generiranje
  • Nastavljiva dolžina in abeceda

Primer: V1StGXR8_Z5jdHi6B-myT

Snowflake ID (Twitter)

  • 64-bitni ID (manjši od UUID)
  • Časovno razvrstljiv
  • Vsebuje ID delavca in zaporedno številko
  • Zahteva centralizirano konfiguracijo

Primer: 1234567890123456789

Zmogljivost in optimizacija

Hitrost generiranja

Naš generator lahko ustvari:

  • 1 UUID: < 1 ms
  • 100 UUID: ~10-20 ms
  • 1000 UUID: ~100-200 ms

Nasveti za zmogljivost

  1. Serijsko generiranje – Če potrebujete veliko UUID-jev, jih generirajte vse naenkrat namesto posamezno
  2. Shranjevanje v PB – Indeksirajte stolpce UUID za hitro iskanje
  3. Kompresija – UUID-je shranite v binarni obliki (16 bajtov) namesto niza (36 bajtov)
  4. Predpomnjenje – V nekaterih primerih lahko UUID-je vnaprej generirate in jih shranite v predpomnilnik

Za razvijalce

Struktura UUID v4

xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
|        |    |    |    |
|        |    |    |    └─ 48 bitov naključnih podatkov (node)
|        |    |    └────── 16 bitov naključnih podatkov z varianto (clock_seq)
|        |    └─────────── 12 bitov naključnih podatkov + 4 biti različice (time_hi_and_version)
|        └──────────────── 16 bitov naključnih podatkov (time_mid)
└───────────────────────── 32 bitov naključnih podatkov (time_low)
  • Različica (4 bite): vedno 0100 (binarno) = 4 (heksadecimalno)
  • Varianta (2-3 bite): vedno 10 (binarno) za RFC 4122

Testiranje UUID

// 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);
  });
});

Varnostni vidiki

Česa ne smete početi z UUID

Ne uporabljajte UUID v1 za občutljive aplikacije – Vsebuje časovni žig, kar je lahko varnostno tveganje

Ne uporabljajte Math.random() za generiranje UUID – Ni kriptografsko varno

Ne zanašajte se na UUID za avtorizacijo – UUID je mogoče uganiti (čeprav z izjemno majhno verjetnostjo)

Ne shranjujte UUID v piškotke brez šifriranja – Uporabite podpisane piškotke ali JWT

Kaj storiti

Uporabite UUID v4 za večino primerov – Najvišja entropija in varnost

Kombinirajte UUID z drugimi varnostnimi ukrepi – Za upravljanje sej uporabite HTTPS, HttpOnly piškotke in kratek rok veljavnosti

Validirajte UUID na strežniku – Vedno preverite format in različico UUID

Uporabljajte kriptografsko varne vire naključnosticrypto.getRandomValues() v brskalniku, /dev/urandom na Linuxu

Zanimivosti

  • Število možnih UUID v4: 2^122 ≈ 5.3 × 10^36 (340 undecilijonov)
  • Potrebna kolizija: Za 50% verjetnost kolizije morate generirati 2.71 × 10^18 UUID (2.71 kvintilijonov)
  • Velikost vseh možnih UUID: Če bi vsak UUID shranili kot 16 bajtov, bi celoten prostor zavzel 85 zettabajtov (85 milijard terabajtov)
  • Izvor: UUID je bil standardiziran kot del DCE (Distributed Computing Environment) leta 1990