UUID v4 vs v7: koji jedinstveni identifikator odabrati?
UUID je 128-bitni jedinstveni identifikator bez središnje koordinacije. Verzija 4, potpuno nasumična, dominira godinama. Verzija 7, novija (RFC 9562, 2024), uključuje vremensku oznaku na početku kako bi proizvela vremenski poredane identifikatore. Ta razlika, naizgled bezazlena, radikalno mijenja performanse u bazi podataka. Evo koju odabrati.
Što je UUID?
UUID (Universally Unique Identifier) je 128-bitni broj predstavljen s 32 heksadecimalna znaka grupirana u pet blokova, na primjer 550e8400-e29b-41d4-a716-446655440000. Njegova svrha: generirati jedinstveni identifikator bez traženja od središnjeg autoriteta, što ga čini idealnim za distribuirane sustave. Možete ih generirati našim generatorom UUID-a.
Postoji više verzija; najrelevantnije danas za ključeve zapisa su v4 (nasumična) i v7 (vremenski poredana).
UUID v4 (nasumičan)
UUID v4 sastoji se od 122 nasumična bita (ostatak kodira verziju i varijantu). Vjerojatnost sudara je toliko niska da je u praksi zanemariva. To je zadana verzija u većini jezika i biblioteka.
- Nepredvidiv: savršen za tokene ili javne identifikatore koje ne želimo da budu pogodljivi
- Bez curenja informacija: ne otkriva ni datum ni redoslijed stvaranja
- Nedostatak: potpuno neuredan, što opterećuje indekse baze podataka
UUID v7 (vremenski poredan)
UUID v7 postavlja Unix vremensku oznaku u milisekundama na svojih prvih 48 bitova, nakon čega slijede nasumični bitovi. Dva UUID v7 generirana u različitim trenucima stoga se sortiraju redoslijedom svojeg stvaranja, ostajući jedinstveni i praktički nemogući za pogoditi.
- Sortabilan: leksikografski redoslijed odgovara kronološkom redoslijedu
- Prijateljski prema indeksima: umetanja se obavljaju na kraju indeksa, poput auto-inkrementa
- Protuvrijednost: otkriva trenutak stvaranja, što može biti nepoželjno za javni identifikator
Usporedna tablica
| Kriterij | UUID v4 | UUID v7 |
|---|---|---|
| Sastav | 122 nasumična bita | Vremenska oznaka + nasumično |
| Vremenski poredan | Ne | Da |
| Sortabilan | Ne | Da (kronološki) |
| Performanse indeksa | Niske (fragmentacija) | Visoke (sekvencijalna umetanja) |
| Nepredvidivost | Potpuna | Visoka ali otkriva trenutak |
| Curenje informacija | Nikakvo | Datum stvaranja |
| Zrelost / podrška | Univerzalna | Nedavno (RFC 9562, 2024) |
Utjecaj na baze podataka
To je srž teme. Relacijske baze pohranjuju svoje indekse u B-stabla (B-tree). Umetanje nasumičnih ključeva (v4) raspršuje zapise posvuda u indeksu, uzrokujući fragmentaciju, cijepanje stranica i manje učinkovit predmemoriju. Na velikim količinama performanse umetanja znatno se pogoršavaju.
Poredani ključevi (v7) uvijek se umeću na kraj indeksa, poput auto-inkrementiranog identifikatora. Dobivaju se brza umetanja, bolja lokalnost i kompaktniji indeks. To je posebno izraženo s primarnim ključem u InnoDB (MySQL), gdje primarni ključ određuje fizički redoslijed redaka.
Kada odabrati jedan ili drugi
Odaberite UUID v4 kada
- Identifikator je javno izložen i ne smije ništa otkrivati
- Generirate tokene, poveznice za dijeljenje, tajne
- Redoslijed i datum stvaranja ne smiju biti pogodljivi
- Želite maksimalnu kompatibilnost s postojećim
Odaberite UUID v7 kada
- UUID služi kao primarni ključ u bazi podataka
- Količina umetanja je velika i performanse indeksa su važne
- Želite sortirati po redoslijedu stvaranja bez namjenskog stupca
- Otkrivanje trenutka stvaranja nije problem
Preporuka
Za primarni ključ baze podataka, sada preferirajte UUID v7: zadržavate distribuiranu jedinstvenost UUID-a uz izbjegavanje kazne indeksa verzije v4. Zadržite UUID v4 za javne identifikatore, tokene i tajne, gdje prevladavaju potpuna nepredvidivost i odsutnost vremenskog curenja.
Ipak provjerite podršku za v7 u svojem jeziku i ORM-u: RFC je nedavan, ali prihvaćenost brzo napreduje.
Često postavljana pitanja
Je li UUID v7 manje siguran od v4?
Ostaje vrlo teško pogodljiv zahvaljujući svojim nasumičnim bitovima, ali otkriva trenutak stvaranja preko svoje vremenske oznake. Za javni identifikator gdje datum ne smije iscuriti, ili za tajnu, preferirajte v4.
Zašto UUID v4 usporava baze podataka?
Jer njegove nasumične vrijednosti raspršuju umetanja po cijelom B-tree indeksu, što fragmentira stranice i smanjuje učinkovitost predmemorije. Verzija v7, poredana, umeće na kraj indeksa i izbjegava taj problem.
Mogu li migrirati s v4 na v7?
Da za nove zapise: oba formata koegzistiraju u istom UUID stupcu. Nema potrebe prepisivati povijest; jednostavno prebacite generiranje novih ključeva na v7.
Što je s verzijama v1 i v6?
Verzija v1 kodira vremensku oznaku i MAC adresu, što stvara probleme s privatnošću. Verzija v6 preuređuje v1 kako bi postala sortabilna. Za novi projekt, v7 je poredana verzija koju preporučuje RFC 9562.