UUID v4 vs v7: melyik egyedi azonosítót válasszuk?

Az UUID egy 128 bites egyedi azonosító központi koordináció nélkül. A 4-es verzió, teljesen véletlenszerű, évek óta uralkodik. A 7-es verzió, az újabb (RFC 9562, 2024), egy időbélyeget tartalmaz az elején, hogy időrendezett azonosítókat állítson elő. Ez a látszólag ártalmatlan különbség gyökeresen megváltoztatja a teljesítményt az adatbázisban. Íme, melyiket válasszuk.

Mi az az UUID?

Az UUID (Universally Unique Identifier) egy 128 bites szám, amelyet 32 hexadecimális karakter képvisel öt blokkba csoportosítva, például 550e8400-e29b-41d4-a716-446655440000. Létezésének oka: egyedi azonosító létrehozása anélkül, hogy egy központi hatóságtól kérnénk, ami ideálissá teszi elosztott rendszerekhez. Generálhat ilyeneket a UUID generátorunkkal.

Több verzió létezik; ma a legrelevánsabbak a rekordkulcsokhoz a v4 (véletlenszerű) és a v7 (időrendezett).

UUID v4 (véletlenszerű)

Az UUID v4 122 véletlenszerű bitből áll (a többi a verziót és a variánst kódolja). Az ütközés valószínűsége olyan alacsony, hogy a gyakorlatban elhanyagolható. Ez az alapértelmezett verzió a legtöbb nyelvben és könyvtárban.

  • Kiszámíthatatlan: tökéletes tokenekhez vagy nyilvános azonosítókhoz, amelyeket nem akarunk kitalálhatóvá tenni
  • Nincs információszivárgás: nem fedi fel sem a létrehozás dátumát, sem a sorrendjét
  • Hátrány: teljesen rendezetlen, ami megviseli az adatbázis-indexeket

UUID v7 (időrendezett)

Az UUID v7 egy Unix időbélyeget helyez ezredmásodpercben az első 48 bitjére, amelyet véletlenszerű bitek követnek. Két különböző pillanatban generált UUID v7 tehát a létrehozásuk sorrendjében rendeződik, miközben egyedi és gyakorlatilag kitalálhatatlan marad.

  • Rendezhető: a lexikografikus sorrend megfelel a kronologikus sorrendnek
  • Indexbarát: a beszúrások az index végén történnek, mint egy auto-increment esetén
  • Ellentételezés: felfedi a létrehozás pillanatát, ami nemkívánatos lehet egy nyilvános azonosítónál

Összehasonlító táblázat

Szempont UUID v4 UUID v7
Összetétel122 véletlenszerű bitIdőbélyeg + véletlenszerű
IdőrendezettNemIgen
RendezhetőNemIgen (kronologikus)
Index teljesítményAlacsony (fragmentáció)Magas (szekvenciális beszúrások)
KiszámíthatatlanságTeljesMagas, de felfedi a pillanatot
InformációszivárgásSemmilyenLétrehozás dátuma
Érettség / támogatásUniverzálisFriss (RFC 9562, 2024)

Hatás az adatbázisokra

Ez a téma lényege. A relációs adatbázisok az indexeiket B-fákban (B-tree) tárolják. A véletlenszerű kulcsok (v4) beszúrása szétszórja az írásokat az indexben, fragmentációt, oldalfelosztásokat és kevésbé hatékony gyorsítótárat okozva. Nagy mennyiségeken a beszúrási teljesítmény jelentősen romlik.

A rendezett kulcsok (v7) mindig az index végére szúródnak be, mint egy auto-increment azonosító. Gyors beszúrásokat, jobb lokalitást és kompaktabb indexet kapunk. Ez különösen szembetűnő egy elsődleges kulccsal InnoDB-ben (MySQL), ahol az elsődleges kulcs határozza meg a sorok fizikai sorrendjét.

Mikor melyiket válasszuk

Válassza az UUID v4-et, ha

  • Az azonosító nyilvánosan ki van téve és semmit sem szabad felfednie
  • Tokeneket, megosztási linkeket, titkokat generál
  • A sorrend és a létrehozás dátuma nem lehet kitalálható
  • Maximális kompatibilitást szeretne a meglévővel

Válassza az UUID v7-et, ha

  • Az UUID elsődleges kulcsként szolgál egy adatbázisban
  • A beszúrások mennyisége magas és az index teljesítménye számít
  • Létrehozási sorrend szerint szeretne rendezni dedikált oszlop nélkül
  • A létrehozás pillanatának felfedése nem probléma

Ajánlás

Egy adatbázis elsődleges kulcsához mostantól részesítse előnyben az UUID v7-et: megtartja az UUID elosztott egyediségét, miközben elkerüli a v4 index-büntetését. Tartsa meg az UUID v4-et a nyilvános azonosítókhoz, tokenekhez és titkokhoz, ahol a teljes kiszámíthatatlanság és az időbeli szivárgás hiánya az elsődleges.

Mindazonáltal ellenőrizze a v7 támogatását a nyelvében és az ORM-jében: az RFC friss, de az elterjedtsége gyorsan halad.

Gyakori kérdések

Kevésbé biztonságos-e az UUID v7 a v4-nél?

Véletlenszerű bitjeinek köszönhetően nagyon nehéz kitalálni, de időbélyegén keresztül felfedi a létrehozás pillanatát. Egy nyilvános azonosítóhoz, ahol a dátum nem szivároghat ki, vagy egy titokhoz részesítse előnyben a v4-et.

Miért lassítja az UUID v4 az adatbázisokat?

Mert véletlenszerű értékei szétszórják a beszúrásokat az egész B-tree indexben, ami fragmentálja az oldalakat és csökkenti a gyorsítótár hatékonyságát. A v7, amely rendezett, az index végére szúr be és elkerüli ezt a problémát.

Migrálhatok v4-ről v7-re?

Igen, az új rekordok esetén: a két formátum együtt él ugyanabban az UUID oszlopban. Nem kell újraírni az előzményeket; egyszerűen váltsa át az új kulcsok generálását a v7-re.

Mi a helyzet a v1 és v6 verziókkal?

A v1 az időbélyeget és a MAC-címet kódolja, ami adatvédelmi problémákat vet fel. A v6 átrendezi a v1-et, hogy rendezhetővé tegye. Egy új projekthez a v7 az RFC 9562 által ajánlott rendezett verzió.