UUID v4 vs v7: ktorý jedinečný identifikátor zvoliť?
UUID je 128-bitový identifikátor jedinečný bez centrálnej koordinácie. Verzia 4, úplne náhodná, dominuje už roky. Verzia 7, novšia (RFC 9562, 2024), zahŕňa časovú pečiatku na začiatku, aby vytvorila časovo usporiadané identifikátory. Tento rozdiel, zdanlivo bezvýznamný, radikálne mení výkon v databáze. Tu je, ktorý zvoliť.
Čo je UUID?
UUID (Universally Unique Identifier) je 128-bitové číslo reprezentované 32 šestnástkovými znakmi zoskupenými do piatich blokov, napríklad 550e8400-e29b-41d4-a716-446655440000. Jeho zmysel: vygenerovať jedinečný identifikátor bez toho, aby sme žiadali centrálnu autoritu, čo ho robí ideálnym pre distribuované systémy. Niekoľko ich môžete vygenerovať naším generátorom UUID.
Existuje viacero verzií; najrelevantnejšie dnes pre kľúče záznamov sú v4 (náhodná) a v7 (časovo usporiadaná).
UUID v4 (náhodný)
UUID v4 sa skladá zo 122 náhodných bitov (zvyšok kóduje verziu a variant). Pravdepodobnosť kolízie je taká nízka, že je v praxi zanedbateľná. Je to predvolená verzia vo väčšine jazykov a knižníc.
- Nepredvídateľný: ideálny pre tokeny alebo verejné identifikátory, ktoré nemajú byť uhádnuteľné
- Žiadny únik informácie: neodhaľuje ani dátum, ani poradie vytvorenia
- Nevýhoda: úplne neusporiadaný, čo trápi databázové indexy
UUID v7 (časovo usporiadaný)
UUID v7 umiestňuje časovú pečiatku Unix v milisekundách na svojich prvých 48 bitov, za ktorými nasledujú náhodné bity. Dva UUID v7 vygenerované v rôznych okamihoch sa teda triedia v poradí ich vytvorenia, pričom zostávajú jedinečné a prakticky nemožné uhádnuť.
- Triediteľný: lexikografické poradie zodpovedá chronologickému poradiu
- Priateľský k indexom: vkladania sa dejú na konci indexu, ako auto-increment
- Protihodnota: odhaľuje okamih vytvorenia, čo môže byť pri verejnom identifikátore nežiaduce
Porovnávacia tabuľka
| Kritérium | UUID v4 | UUID v7 |
|---|---|---|
| Zloženie | 122 náhodných bitov | Časová pečiatka + náhodné |
| Časovo usporiadaný | Nie | Áno |
| Triediteľný | Nie | Áno (chronologicky) |
| Výkon indexu | Nízky (fragmentácia) | Vysoký (sekvenčné vkladania) |
| Nepredvídateľnosť | Úplná | Vysoká ale odhaľuje okamih |
| Únik informácie | Žiadny | Dátum vytvorenia |
| Vyzretosť / podpora | Univerzálna | Nedávna (RFC 9562, 2024) |
Vplyv na databázy
Toto je jadro veci. Relačné databázy ukladajú svoje indexy do stromov B (B-tree). Vkladanie náhodných kľúčov (v4) rozptyľuje zápisy po celom indexe, čo spôsobuje fragmentáciu, štiepenie stránok a menej účinnú cache. Pri veľkých objemoch sa výkon vkladania výrazne zhoršuje.
Usporiadané kľúče (v7) sa vkladajú vždy na koniec indexu, ako auto-inkrementovaný identifikátor. Získava sa rýchle vkladanie, lepšia lokalita a kompaktnejší index. Je to obzvlášť zreteľné pri primárnom kľúči v InnoDB (MySQL), kde primárny kľúč určuje fyzické poradie riadkov.
Kedy zvoliť jeden alebo druhý
Zvoľte UUID v4, keď
- Identifikátor je vystavený verejne a nemá nič odhaľovať
- Generujete tokeny, zdieľacie odkazy, tajomstvá
- Poradie a dátum vytvorenia nemajú byť uhádnuteľné
- Chcete maximálnu kompatibilitu s existujúcim
Zvoľte UUID v7, keď
- UUID slúži ako primárny kľúč v databáze
- Objem vkladaní je vysoký a výkon indexu je dôležitý
- Chcete triediť podľa poradia vytvorenia bez vyhradeného stĺpca
- Odhalenie okamihu vytvorenia nie je problém
Odporúčanie
Pre primárny kľúč databázy odteraz uprednostnite UUID v7: zachováte distribuovanú jedinečnosť UUID a zároveň sa vyhnete penalizácii indexu pri v4. Ponechajte UUID v4 pre verejné identifikátory, tokeny a tajomstvá, kde prevažuje úplná nepredvídateľnosť a absencia časového úniku.
Napriek tomu si overte podporu v7 vo vašom jazyku a vašom ORM: RFC je nedávna, ale prijatie postupuje rýchlo.
Časté otázky
Je UUID v7 menej bezpečný ako v4?
Zostáva veľmi ťažko uhádnuteľný vďaka svojim náhodným bitom, ale odhaľuje okamih vytvorenia prostredníctvom svojej časovej pečiatky. Pre verejný identifikátor, kde dátum nesmie uniknúť, alebo pre tajomstvo, uprednostnite v4.
Prečo UUID v4 spomaľuje databázy?
Pretože jeho náhodné hodnoty rozptyľujú vkladania po celom indexe B-tree, čo fragmentuje stránky a znižuje účinnosť cache. v7, usporiadaná, vkladá na koniec indexu a tomuto problému sa vyhýba.
Môžem migrovať z v4 na v7?
Áno pre nové záznamy: oba formáty koexistujú v tom istom stĺpci UUID. Netreba prepisovať históriu; jednoducho prepnite generovanie nových kľúčov na v7.
Čo s verziami v1 a v6?
v1 kóduje časovú pečiatku a MAC adresu, čo prináša problémy s ochranou súkromia. v6 preusporadúva v1, aby ju urobila triediteľnou. Pre nový projekt je v7 usporiadanou verziou odporúčanou RFC 9562.