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
Sastav122 nasumična bitaVremenska oznaka + nasumično
Vremenski poredanNeDa
SortabilanNeDa (kronološki)
Performanse indeksaNiske (fragmentacija)Visoke (sekvencijalna umetanja)
NepredvidivostPotpunaVisoka ali otkriva trenutak
Curenje informacijaNikakvoDatum stvaranja
Zrelost / podrškaUniverzalnaNedavno (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.