UUID v4 pret v7: kuru unikālo identifikatoru izvēlēties?

UUID ir 128 bitu identifikators, unikāls bez centrālas koordinācijas. Versija 4, pilnībā nejauša, dominē jau gadiem. Versija 7, jaunāka (RFC 9562, 2024), priekšgalā integrē laika zīmogu, lai radītu laikā sakārtotus identifikatorus. Šī atšķirība, šķietami nenozīmīga, radikāli maina veiktspēju datubāzē. Lūk, kuru izvēlēties.

Kas ir UUID?

UUID (Universally Unique Identifier) ir 128 bitu skaitlis, attēlots ar 32 heksadecimālajiem simboliem, sagrupētiem piecos blokos, piemēram 550e8400-e29b-41d4-a716-446655440000. Tā jēga: ģenerēt unikālu identifikatoru, neprasot centrālai iestādei, kas padara to ideālu sadalītām sistēmām. Varat tos ģenerēt ar mūsu UUID ģeneratoru.

Pastāv vairākas versijas; aktuālākās šodien ierakstu atslēgām ir v4 (nejauša) un v7 (sakārtota laikā).

UUID v4 (nejaušs)

UUID v4 sastāv no 122 nejaušiem bitiem (pārējie kodē versiju un variantu). Sadursmes varbūtība ir tik maza, ka praksē niecīga. Tā ir noklusējuma versija lielākajā daļā valodu un bibliotēku.

  • Neparedzams: ideāls marķieriem vai publiskiem identifikatoriem, kurus nevēlas uzminēt
  • Nekādas informācijas noplūdes: neatklāj ne datumu, ne izveides secību
  • Trūkums: pilnīgi nesakārtots, kas moka datubāzes indeksus

UUID v7 (sakārtots laikā)

UUID v7 savos pirmajos 48 bitos ievieto Unix laika zīmogu milisekundēs, kam seko nejauši biti. Divi UUID v7, kas ģenerēti dažādos brīžos, tādējādi sakārtojas to izveides secībā, paliekot unikāli un praktiski neuzminami.

  • Kārtojams: leksikogrāfiskā secība atbilst hronoloģiskajai secībai
  • Draudzīgs indeksiem: ievietošana notiek indeksa beigās, tāpat kā automātiskā palielināšana
  • Kompensācija: tas atklāj izveides brīdi, kas var būt nevēlami publiskam identifikatoram

Salīdzinājuma tabula

Kritērijs UUID v4 UUID v7
Sastāvs122 nejauši bitiLaika zīmogs + nejaušs
Sakārtots laikā
KārtojamsJā (hronoloģiski)
Indeksa veiktspējaZema (fragmentācija)Augsta (secīga ievietošana)
NeparedzamībaPilnīgaAugsta, bet atklāj brīdi
Informācijas noplūdeNekādaIzveides datums
Briedums / atbalstsUniversālsJauns (RFC 9562, 2024)

Ietekme uz datubāzēm

Tā ir tēmas būtība. Relāciju datubāzes glabā savus indeksus B kokos (B-tree). Ievietojot nejaušas atslēgas (v4), ieraksti tiek izkliedēti visur indeksā, izraisot fragmentāciju, lapu sašķelšanos un mazāk efektīvu kešatmiņu. Lieliem apjomiem ievietošanas veiktspēja jūtami pasliktinās.

Sakārtotas atslēgas (v7) vienmēr ievietojas indeksa beigās, tāpat kā automātiski palielināts identifikators. Iegūst ātru ievietošanu, labāku lokalitāti un kompaktāku indeksu. Tas ir īpaši izteikts ar primāro atslēgu InnoDB (MySQL), kur primārā atslēga nosaka rindu fizisko secību.

Kad izvēlēties vienu vai otru

Izvēlēties UUID v4, kad

  • Identifikators ir publiski redzams un nedrīkst neko atklāt
  • Ģenerējat marķierus, koplietošanas saites, noslēpumus
  • Secība un izveides datums nedrīkst būt uzminami
  • Vēlaties maksimālu saderību ar esošo

Izvēlēties UUID v7, kad

  • UUID kalpo kā primārā atslēga datubāzē
  • Ievietošanas apjoms ir liels un indeksa veiktspēja ir svarīga
  • Vēlaties kārtot pēc izveides secības bez īpašas kolonnas
  • Izveides brīža atklāšana nav problēma

Ieteikums

Datubāzes primārajai atslēgai tagad dodiet priekšroku UUID v7: saglabājat UUID sadalīto unikalitāti, vienlaikus izvairoties no v4 indeksa soda. Saglabājiet UUID v4 publiskiem identifikatoriem, marķieriem un noslēpumiem, kur svarīgākā ir pilnīga neparedzamība un laika noplūdes neesamība.

Tomēr pārbaudiet v7 atbalstu savā valodā un ORM: RFC ir jauns, bet izplatība strauji progresē.

Biežāk uzdotie jautājumi

Vai UUID v7 ir mazāk drošs nekā v4?

To joprojām ir ļoti grūti uzminēt, pateicoties nejaušajiem bitiem, taču tas atklāj izveides brīdi caur savu laika zīmogu. Publiskam identifikatoram, kur datums nedrīkst noplūst, vai noslēpumam dodiet priekšroku v4.

Kāpēc UUID v4 palēnina datubāzes?

Tāpēc ka tā nejaušās vērtības izkliedē ievietošanu pa visu B-tree indeksu, kas fragmentē lapas un samazina kešatmiņas efektivitāti. Sakārtotā v7 ievieto indeksa beigās un izvairās no šīs problēmas.

Vai varu migrēt no v4 uz v7?

Jā jauniem ierakstiem: abi formāti līdzās pastāv tajā pašā UUID kolonnā. Nav jāpārraksta vēsture; vienkārši pārslēdziet jauno atslēgu ģenerēšanu uz v7.

Kā ir ar v1 un v6 versijām?

v1 kodē laika zīmogu un MAC adresi, kas rada konfidencialitātes problēmas. v6 pārkārto v1, lai padarītu to kārtojamu. Jaunam projektam v7 ir RFC 9562 ieteiktā sakārtotā versija.