UUID v4 vs v7: minkä yksilöllisen tunnisteen valita?

UUID on 128-bittinen yksilöllinen tunniste ilman keskitettyä koordinointia. Versio 4, täysin satunnainen, on hallinnut vuosia. Versio 7, uudempi (RFC 9562, 2024), sisältää aikaleiman alussa tuottaakseen ajallisesti järjestettyjä tunnisteita. Tämä näennäisesti vähäpätöinen ero muuttaa radikaalisti suorituskykyä tietokannassa. Näin valitset kumman.

Mikä on UUID?

UUID (Universally Unique Identifier) on 128-bittinen luku, joka esitetään 32 heksadesimaalimerkillä viiteen lohkoon ryhmiteltynä, esimerkiksi 550e8400-e29b-41d4-a716-446655440000. Sen tarkoitus: luoda yksilöllinen tunniste pyytämättä sitä keskusviranomaiselta, mikä tekee siitä ihanteellisen hajautetuille järjestelmille. Voit luoda niitä UUID-generaattorillamme.

Useita versioita on olemassa; nykyään tietuetunnisteiden kannalta merkityksellisimmät ovat v4 (satunnainen) ja v7 (ajallisesti järjestetty).

UUID v4 (satunnainen)

UUID v4 koostuu 122 satunnaisesta bitistä (loput koodaa version ja variantin). Törmäyksen todennäköisyys on niin pieni, että se on käytännössä merkityksetön. Se on oletusversio useimmissa kielissä ja kirjastoissa.

  • Ennustamaton: täydellinen tokeneille tai julkisille tunnisteille, joita ei haluta arvattaviksi
  • Ei tietovuotoa: ei paljasta luontipäivää eikä järjestystä
  • Haitta: täysin järjestämätön, mikä rasittaa tietokantaindeksejä

UUID v7 (ajallisesti järjestetty)

UUID v7 sijoittaa Unix-aikaleiman millisekunteina 48 ensimmäiseen bittiinsä, jota seuraavat satunnaiset bitit. Kaksi eri hetkinä luotua UUID v7:ää järjestyvät siis luontijärjestyksessään pysyen samalla yksilöllisinä ja käytännössä mahdottomina arvata.

  • Järjestettävissä: aakkosellinen järjestys vastaa kronologista järjestystä
  • Indeksiystävällinen: lisäykset tehdään indeksin loppuun, kuten automaattinen kasvatus
  • Vastapuoli: se paljastaa luontihetken, mikä voi olla epätoivottavaa julkiselle tunnisteelle

Vertailutaulukko

Kriteeri UUID v4 UUID v7
Koostumus122 satunnaista bittiäAikaleima + satunnainen
Ajallisesti järjestettyEiKyllä
JärjestettävissäEiKyllä (kronologinen)
Indeksin suorituskykyMatala (pirstoutuminen)Korkea (peräkkäiset lisäykset)
EnnustamattomuusTäysiKorkea mutta paljastaa hetken
TietovuotoEi mitäänLuontipäivä
Kypsyys / tukiUniversaaliUusi (RFC 9562, 2024)

Vaikutus tietokantoihin

Tämä on asian ydin. Relaatiotietokannat tallentavat indeksinsä B-puihin (B-tree). Satunnaisten avainten (v4) lisääminen hajottaa kirjoitukset ympäri indeksiä aiheuttaen pirstoutumista, sivujen jakautumista ja tehottomamman välimuistin. Suurilla volyymeillä lisäyssuorituskyky heikkenee selvästi.

Järjestetyt avaimet (v7) lisätään aina indeksin loppuun, kuten automaattisesti kasvatettu tunniste. Saadaan nopeat lisäykset, parempi paikallisuus ja kompaktimpi indeksi. Tämä on erityisen selvää pääavaimella InnoDB:ssä (MySQL), jossa pääavain määrää rivien fyysisen järjestyksen.

Milloin valita kumpi

Valitse UUID v4, kun

  • Tunniste on julkisesti näkyvissä eikä saa paljastaa mitään
  • Luot tokeneita, jakolinkkejä, salaisuuksia
  • Järjestys ja luontipäivä eivät saa olla arvattavissa
  • Haluat maksimaalisen yhteensopivuuden olemassa olevan kanssa

Valitse UUID v7, kun

  • UUID toimii pääavaimena tietokannassa
  • Lisäysten volyymi on suuri ja indeksin suorituskyky merkitsee
  • Haluat järjestää luontijärjestyksen mukaan ilman erillistä saraketta
  • Luontihetken paljastaminen ei ole ongelma

Suositus

Tietokannan pääavaimelle suosi tästä lähtien UUID v7:ää: säilytät UUID:n hajautetun yksilöllisyyden välttäen samalla v4:n indeksirangaistuksen. Säilytä UUID v4 julkisille tunnisteille, tokeneille ja salaisuuksille, joissa etusijalla ovat täysi ennustamattomuus ja ajallisen vuodon puuttuminen.

Tarkista kuitenkin v7:n tuki kielessäsi ja ORM:ssäsi: RFC on uusi, mutta käyttöönotto etenee nopeasti.

Usein kysytyt kysymykset

Onko UUID v7 vähemmän turvallinen kuin v4?

Se on edelleen hyvin vaikea arvata satunnaisten bittiensä ansiosta, mutta se paljastaa luontihetken aikaleimansa kautta. Julkiselle tunnisteelle, jossa päivä ei saa vuotaa, tai salaisuudelle suosi v4:ää.

Miksi UUID v4 hidastaa tietokantoja?

Koska sen satunnaiset arvot hajottavat lisäykset ympäri B-tree-indeksiä, mikä pirstoo sivuja ja vähentää välimuistin tehokkuutta. Järjestetty v7 lisää indeksin loppuun ja välttää tämän ongelman.

Voinko siirtyä v4:stä v7:ään?

Kyllä uusille tietueille: molemmat muodot esiintyvät rinnakkain samassa UUID-sarakkeessa. Historiaa ei tarvitse kirjoittaa uudelleen; vaihda vain uusien avainten luonti v7:ään.

Entä versiot v1 ja v6?

v1 koodaa aikaleiman ja MAC-osoitteen, mikä aiheuttaa yksityisyysongelmia. v6 järjestää v1:n uudelleen tehdäkseen siitä järjestettävän. Uudelle projektille v7 on RFC 9562:n suosittelema järjestetty versio.