UUID v4 vs v7: millise unikaalse identifikaatori valida?
UUID on 128-bitine unikaalne identifikaator ilma keskse koordineerimiseta. Versioon 4, täielikult juhuslik, on aastaid domineerinud. Versioon 7, uuem (RFC 9562, 2024), lisab algusesse ajatempli, et toota ajaliselt järjestatud identifikaatoreid. See näiliselt tühine erinevus muudab radikaalselt jõudlust andmebaasis. Vaatame, kumba valida.
Mis on UUID?
UUID (Universally Unique Identifier) on 128-bitine arv, mis on esitatud 32 kuueteistkümnendsüsteemi märgiga viide plokki rühmitatuna, näiteks 550e8400-e29b-41d4-a716-446655440000. Selle mõte: genereerida unikaalne identifikaator ilma keskse asutuse poole pöördumata, mis teeb selle ideaalseks hajutatud süsteemide jaoks. Saad neid genereerida meie UUID generaatoriga.
Eksisteerib mitu versiooni; tänapäeval kirje võtmete jaoks kõige asjakohasemad on v4 (juhuslik) ja v7 (ajaliselt järjestatud).
UUID v4 (juhuslik)
UUID v4 koosneb 122 juhuslikust bitist (ülejäänu kodeerib versiooni ja variandi). Kokkupõrke tõenäosus on nii väike, et see on praktikas tühine. See on vaikeversioon enamikus keeltes ja teekides.
- Ettearvamatu: ideaalne tokenite või avalike identifikaatorite jaoks, mida ei taheta ära arvata
- Infolekketa: ei avalda ei loomise kuupäeva ega järjekorda
- Puudus: täielikult korratu, mis kurnab andmebaasi indekseid
UUID v7 (ajaliselt järjestatud)
UUID v7 paigutab oma 48 esimesse bitti Unixi ajatempli millisekundites, millele järgnevad juhuslikud bitid. Kaks erineval hetkel genereeritud UUID v7-t järjestuvad seega oma loomise järjekorras, jäädes samal ajal unikaalseks ja praktiliselt võimatuks ära arvata.
- Järjestatav: leksikograafiline järjekord vastab kronoloogilisele järjekorrale
- Indeksisõbralik: lisamised toimuvad indeksi lõpus, nagu automaatne suurendamine
- Kompromiss: see avaldab loomise hetke, mis võib avaliku identifikaatori jaoks olla ebasoovitav
Võrdlustabel
| Kriteerium | UUID v4 | UUID v7 |
|---|---|---|
| Koostis | 122 juhuslikku bitti | Ajatempel + juhuslik |
| Ajaliselt järjestatud | Ei | Jah |
| Järjestatav | Ei | Jah (kronoloogiline) |
| Indeksi jõudlus | Madal (fragmenteerumine) | Kõrge (järjestikused lisamised) |
| Ettearvamatus | Täielik | Kõrge, kuid avaldab hetke |
| Infoleke | Puudub | Loomise kuupäev |
| Küpsus / tugi | Universaalne | Uus (RFC 9562, 2024) |
Mõju andmebaasidele
See on teema tuum. Relatsioonilised andmebaasid salvestavad oma indeksid B-puudesse (B-tree). Juhuslike võtmete (v4) lisamine hajutab kirjutamised üle kogu indeksi, põhjustades fragmenteerumist, lehekülgede lõhenemist ja vähem tõhusat puhverdust. Suurte mahtude puhul halveneb lisamise jõudlus märgatavalt.
Järjestatud võtmed (v7) lisatakse alati indeksi lõppu, nagu automaatselt suurendatud identifikaator. Saadakse kiired lisamised, parem lokaalsus ja kompaktsem indeks. See on eriti märgatav primaarvõtmega InnoDB-s (MySQL), kus primaarvõti määrab ridade füüsilise järjekorra.
Millal kumba valida
Vali UUID v4, kui
- Identifikaator on avalikult eksponeeritud ja ei tohi midagi avaldada
- Genereerid tokeneid, jagamislinke, saladusi
- Järjekord ja loomise kuupäev ei tohi olla äraarvatavad
- Soovid maksimaalset ühilduvust olemasolevaga
Vali UUID v7, kui
- UUID on andmebaasis primaarvõti
- Lisamiste maht on suur ja indeksi jõudlus loeb
- Soovid sortida loomise järjekorra järgi ilma pühendatud veeruta
- Loomise hetke avaldamine ei ole probleem
Soovitus
Andmebaasi primaarvõtme jaoks eelista nüüdsest UUID v7-t: säilitad UUID hajutatud unikaalsuse, vältides samal ajal v4 indeksitrahvi. Hoia UUID v4 avalike identifikaatorite, tokenite ja saladuste jaoks, kus esikohal on täielik ettearvamatus ja ajalise lekke puudumine.
Kontrolli siiski v7 tuge oma keeles ja ORM-is: RFC on uus, kuid levik edeneb kiiresti.
Korduma kippuvad küsimused
Kas UUID v7 on vähem turvaline kui v4?
Seda on tänu juhuslikele bittidele endiselt väga raske ära arvata, kuid see avaldab oma ajatempli kaudu loomise hetke. Avaliku identifikaatori jaoks, kus kuupäev ei tohi lekkida, või saladuse jaoks eelista v4-t.
Miks UUID v4 aeglustab andmebaase?
Sest selle juhuslikud väärtused hajutavad lisamised üle kogu B-tree indeksi, mis fragmenteerib lehekülgi ja vähendab puhverduse tõhusust. Järjestatud v7 lisab indeksi lõppu ja väldib seda probleemi.
Kas saan migreeruda v4-lt v7-le?
Jah, uute kirjete puhul: mõlemad vormingud eksisteerivad samas UUID veerus koos. Ajalugu pole vaja ümber kirjutada; lihtsalt lülita uute võtmete genereerimine v7-le.
Aga versioonid v1 ja v6?
v1 kodeerib ajatempli ja MAC-aadressi, mis tekitab privaatsusprobleeme. v6 järjestab v1 ümber, et muuta see järjestatavaks. Uue projekti jaoks on v7 RFC 9562 soovitatud järjestatud versioon.