UUID v4 vs v7: kateri edinstveni identifikator izbrati?

UUID je 128-bitni edinstveni identifikator brez osrednje koordinacije. Različica 4, popolnoma naključna, prevladuje že leta. Različica 7, novejša (RFC 9562, 2024), vključuje časovni žig na začetku in ustvarja časovno urejene identifikatorje. Ta razlika, na videz nepomembna, korenito spremeni zmogljivost v podatkovni bazi. Tukaj je, katero izbrati.

Kaj je UUID?

UUID (Universally Unique Identifier) je 128-bitno število, predstavljeno z 32 šestnajstiškimi znaki, razvrščenimi v pet blokov, na primer 550e8400-e29b-41d4-a716-446655440000. Njegov namen: ustvariti edinstven identifikator brez prošnje osrednji avtoriteti, kar ga naredi idealnega za porazdeljene sisteme. Ustvarite jih lahko z našim generatorjem UUID.

Obstaja več različic; danes najpomembnejši za ključe zapisov sta v4 (naključna) in v7 (časovno urejena).

UUID v4 (naključen)

UUID v4 je sestavljen iz 122 naključnih bitov (preostanek kodira različico in varianto). Verjetnost trka je tako majhna, da je v praksi zanemarljiva. To je privzeta različica v večini jezikov in knjižnic.

  • Nepredvidljiv: popoln za žetone ali javne identifikatorje, ki jih ne želimo uganljivih
  • Brez uhajanja informacij: ne razkriva niti datuma niti vrstnega reda ustvarjanja
  • Slabost: popolnoma neurejen, kar muči indekse podatkovne baze

UUID v7 (časovno urejen)

UUID v7 postavi časovni žig Unix v milisekundah na prvih 48 bitov, čemur sledijo naključni biti. Dva UUID v7, ustvarjena v različnih trenutkih, se torej razvrstita v vrstnem redu njunega ustvarjanja, hkrati pa ostaneta edinstvena in praktično neuganljiva.

  • Razvrstljiv: leksikografski vrstni red ustreza kronološkemu vrstnemu redu
  • Prijazen do indeksov: vstavljanja se izvajajo na koncu indeksa, kot pri samodejnem povečevanju
  • Protiutež: razkriva trenutek ustvarjanja, kar je lahko nezaželeno za javni identifikator

Primerjalna tabela

Merilo UUID v4 UUID v7
Sestava122 naključnih bitovČasovni žig + naključno
Časovno urejenNeDa
RazvrstljivNeDa (kronološko)
Zmogljivost indeksaNizka (fragmentacija)Visoka (zaporedna vstavljanja)
NepredvidljivostPopolnaVisoka, a razkriva trenutek
Uhajanje informacijNobenoDatum ustvarjanja
Zrelost / podporaUniverzalnaNova (RFC 9562, 2024)

Vpliv na podatkovne baze

To je bistvo teme. Relacijske baze shranjujejo svoje indekse v drevesih B (B-tree). Vstavljanje naključnih ključev (v4) razprši zapise povsod po indeksu, kar povzroča fragmentacijo, razcepe strani in manj učinkovit predpomnilnik. Pri velikih količinah se zmogljivost vstavljanja izrazito poslabša.

Urejeni ključi (v7) se vedno vstavljajo na konec indeksa, kot samodejno povečan identifikator. Dobimo hitra vstavljanja, boljšo lokalnost in kompaktnejši indeks. To je še posebej očitno pri primarnem ključu v InnoDB (MySQL), kjer primarni ključ določa fizični vrstni red vrstic.

Kdaj izbrati enega ali drugega

Izberite UUID v4, kadar

  • Identifikator je javno izpostavljen in ne sme ničesar razkriti
  • Ustvarjate žetone, povezave za deljenje, skrivnosti
  • Vrstni red in datum ustvarjanja ne smeta biti uganljiva
  • Želite največjo združljivost z obstoječim

Izberite UUID v7, kadar

  • UUID služi kot primarni ključ v podatkovni bazi
  • Količina vstavljanj je velika in zmogljivost indeksa šteje
  • Želite razvrščati po vrstnem redu ustvarjanja brez namenskega stolpca
  • Razkritje trenutka ustvarjanja ni težava

Priporočilo

Za primarni ključ podatkovne baze odslej raje izberite UUID v7: ohranite porazdeljeno edinstvenost UUID, hkrati pa se izognete kazni indeksa pri v4. UUID v4 ohranite za javne identifikatorje, žetone in skrivnosti, kjer prevladata popolna nepredvidljivost in odsotnost časovnega uhajanja.

Vseeno preverite podporo za v7 v vašem jeziku in ORM: RFC je nov, a sprejemanje hitro napreduje.

Pogosta vprašanja

Ali je UUID v7 manj varen od v4?

Ostaja zelo težko uganljiv zaradi svojih naključnih bitov, a razkriva trenutek ustvarjanja prek svojega časovnega žiga. Za javni identifikator, kjer datum ne sme uhajati, ali za skrivnost raje izberite v4.

Zakaj UUID v4 upočasnjuje podatkovne baze?

Ker njegove naključne vrednosti razpršijo vstavljanja po celotnem indeksu B-tree, kar fragmentira strani in zmanjša učinkovitost predpomnilnika. Urejeni v7 vstavlja na konec indeksa in se izogne tej težavi.

Ali lahko preidem z v4 na v7?

Da, za nove zapise: oba formata sobivata v istem stolpcu UUID. Ni treba prepisati zgodovine; preprosto preklopite ustvarjanje novih ključev na v7.

Kaj pa različici v1 in v6?

v1 kodira časovni žig in naslov MAC, kar prinaša težave z zasebnostjo. v6 preuredi v1, da postane razvrstljiva. Za nov projekt je v7 urejena različica, ki jo priporoča RFC 9562.