UUID v4 generatorius

Generuokite UUID v4 reikšmes internetu: 122 atsitiktiniai bitai, standartinis UUID pavidalas ir kopijavimui paruošti rezultatai jūsų naršyklėje.

Formatas
Sugeneruoti ID
Paruošta. Generuokite UUID v4 reikšmes savo naršyklėje.

Kaip sukuriamas šis ID

Struktūra
128 bitų UUID su 4 versijos ir RFC varianto bitais, rodomas kaip 8-4-4-4-12 šešioliktainės grupės.
Entropija
122 atsitiktiniai bitai iš crypto.randomUUID().
Laikas
Nėra; v4 ID neatskleidžia, kada jie buvo sukurti.
Kolizijos rizika
Kolizijas valdo 122 atsitiktiniai bitai, o tai toli viršija praktinius kiekius įprastose sistemose.
Pavyzdys
920b1f62-7d3d-4a68-8491-ade0d0788e92

Jūsų ID generuojami lokaliai, naudojant stiprų naršyklės atsitiktinių skaičių generatorių. Nieko nesiunčiama į „BroBroGo“.

DUK

Kada turėčiau naudoti UUID v4?

Naudokite UUID v4, kai jums reikia nepermatomų atsitiktinių identifikatorių, kurie nėra rūšiuojami pagal sukūrimo laiką ir neatskleidžia laiko informacijos.

Ar galiu pašalinti brūkšnelius arba naudoti didžiąsias raides?

Taip. UUID v4 įrankyje yra parinkčių skydelis, todėl galite įjungti arba išjungti brūkšnelius bei didžiąsias raides.

UUID v4 generatorius: 122 bitų atsitiktinumas be laiko žymos

UUID v4 generatorius sukuria vieną ar daugiau atsitiktinių identifikatorių pagal RFC 4122 standartą. Kiekvienas UUID v4 yra 36 simbolių ilgio eilutė standartiniu 8‑4‑4‑4‑12 formatu, sudaryta iš šešioliktainių skaitmenų. Jūs kontroliuojate generuojamų identifikatorių skaičių (nuo 1 iki 100), raidžių didžiąsias raides ir brūkšnelių įtraukimą. Identifikatoriai sukuriami akimirksniu naršyklėje, be jokio serverio užklausos.

Kaip veikia atsitiktinumas UUID v4

UUID v4 naudoja 122 bitus gryno atsitiktinumo. Likę 6 bitai yra fiksuoti: 4 bitai žymi versiją (v4), o 2 bitai – variantą (RFC 4122). Tai reiškia, kad iš 128 bitų, sudarančių UUID, 122 yra visiškai atsitiktiniai. Standartiniai šešioliktainiai simboliai – 0–9 ir a–f (arba A–F) – užkoduoti šį atsitiktinumą.

Generavimas vyksta naršyklėje naudojant crypto.randomUUID arba lygiavertį kriptografiškai saugų atsitiktinių skaičių generatorių. Tai nėra paprastas Math.random(), kuris nėra pakankamai atsitiktinis kriptografinėms reikmėms. Naršyklės kriptografinis API naudoja operacinės sistemos teikiamą entropiją, tinkamą saugumo reikalaujančioms užduotims.

Kiekvienas UUID v4 identifikatorius turi 2^122 galimų reikšmių – apie 5,3 × 10^36. Palyginimui, tai daugiau nei vandens molekulių Žemės vandenynuose (apie 3 × 10^34). Ši erdvė yra tokia didžiulė, kad atsitiktinis pasikartojimas praktiškai neįmanomas, nebent generuojate milijardus identifikatorių per sekundę milijonus metų.

Susidūrimo tikimybė: kada tai tampa problema

Susidūrimas (kolizija) įvyksta, kai du nepriklausomai sugeneruoti UUID v4 yra identiški. Tikimybė apskaičiuojama pagal gimtadienio paradokso formulę. Jei turite n atsitiktinių UUID, tikimybė, kad bent du sutaps, yra maždaug:

P ≈ n² / (2 × 2¹²²)

Praktiniais skaičiais: jei sugeneruosite 1 milijardą UUID v4, tikimybė rasti bent vieną sutapimą yra maždaug 1 iš 2^61 (apie 1 iš 2,3 × 10^18). Tai reiškia, kad net ir didžiausiose sistemose su milijardais objektų kolizija yra teorinė, o ne praktinė problema.

Tai nereiškia, kad galite visiškai ignoruoti kolizijų galimybę. Jei jūsų sistema generuoja UUID v4 labai dideliu mastu (pvz., daugiau nei 10^15 identifikatorių), kolizijos tikimybė tampa reikšminga. Tačiau daugumai realių programų UUID v4 kolizija yra mažiau tikėtina nei aparatinės įrangos klaida ar meteorito smūgis.

Poveikis duomenų bazių indeksavimui: B-medžio fragmentacija

UUID v4 identifikatoriai pagal apibrėžimą rūšiuojasi atsitiktinai. Jie neturi laiko užsakymo ar jokios kitos struktūros, leidžiančios nuspėti jų seką. Tai yra esminis skirtumas nuo laiko pagrįstų identifikatorių, tokių kaip UUID v7, ULID ar sekos numeriai.

Kai naudojate UUID v4 kaip pirminį raktą duomenų bazėje su B-medžio (B-tree) indeksu, kiekvienas naujas įrašas įterpiamas į atsitiktinę indekso vietą. Tai sukelia:

  • Indekso fragmentaciją – B-medis nuolat persitvarko, nes nauji raktai patenka ne į pabaigą, o į atsitiktinius tarpus.
  • Blogesnį puslapių užpildymą – dėl atsitiktinio įterpimo indekso puslapiai lieka nepilnai užpildyti, todėl jiems reikia daugiau vietos diske.
  • Lėtesnį įrašymą – kiekvienas INSERT gali sukelti kelis B-medžio puslapių suskaidymus, ypač jei indeksas yra didelis ir netelpa atmintyje.

Šis efektas ypač juntamas didelėse sistemose, kur rašymo operacijos yra dažnos. Duomenų bazės, tokios kaip PostgreSQL, MySQL ar SQL Server, patiria pastebimą našumo sumažėjimą, kai pirminis raktas yra atsitiktinis. InnoDB variklis (MySQL/MariaDB) naudoja grupuotą indeksą, todėl atsitiktinis pirminis raktas sukelia dar didesnę problemą – duomenys diske išsibarsto, o ne lieka gretimi.

Tai nereiškia, kad UUID v4 niekada neturėtų būti naudojamas duomenų bazėse. Tai tik reiškia, kad reikia įvertinti kompromisą: atsitiktinumas ir nepriklausomybė nuo centro prieš rašymo našumą. Daugelyje sistemų šis kompromisas yra priimtinas, ypač kai rašymo operacijų nėra labai daug.

Palyginimas su laiko pagrįstais identifikatoriais

Savybė UUID v4 UUID v7 ULID
Atsitiktinumas 122 bitai 74 bitai 80 bitų
Laiko dalis Nėra 48 bitai (milisekundės) 48 bitai (milisekundės)
Rūšiavimas Atsitiktinis Pagal laiką Pagal laiką
Indekso fragmentacija Didelė Maža Maža
Atsparumas spėjimui Didelis Vidutinis Vidutinis

UUID v7, kaip ir ULID, turi laiko dalį, kuri užtikrina, kad identifikatoriai rūšiuojasi pagal sukūrimo laiką. Tai sumažina B-medžio fragmentaciją, nes nauji raktai paprastai patenka į indekso pabaigą. Tačiau laiko dalis sumažina atsitiktinumo kiekį, o tai gali būti svarbu saugumo požiūriu.

Naudojimo atvejai: kada pasirinkti UUID v4

Saugumo reikalaujančios programos. UUID v4 yra tinkamas API raktams, sesijos žetonams ir kitiems identifikatoriams, kuriuos sunku atspėti. Kadangi nėra laiko informacijos, sunku nustatyti, kada identifikatorius buvo sukurtas, ar numatyti būsimus identifikatorius.

Distribuotos sistemos be centrinio koordinatoriaus. Kai kelios sistemos nepriklausomai generuoja identifikatorius, UUID v4 leidžia dirbti be sinchronizacijos – kiekviena sistema gali generuoti identifikatorius savarankiškai, be jokio ryšio su kitomis sistemomis.

Paslėpti įrašų skaičiai. Sekos numeriai arba automatinio didėjimo raktai atskleidžia, kiek įrašų yra lentelėje. UUID v4 to neleidžia – iš identifikatoriaus negalima nustatyti, kiek įrašų egzistuoja prieš jį.

Testavimo ir duomenų generavimas. Kai reikia užpildyti duomenų bazę testiniais duomenimis, UUID v4 yra tinkamas pasirinkimas, nes jis sukuria tikroviškus, unikalius identifikatorius.

Formato pritaikymas: brūkšneliai ir didžiosios raidės

Brūkšneliai yra standartinė UUID formato dalis. Jie padeda vizualiai atskirti dalis ir palengvina skaitymą. Tačiau kai kuriais atvejais jie gali būti nepageidaujami:

  • URL parametruose (pvz., ?id=...) brūkšneliai gali būti nereikalingi arba sukelti painiavą.
  • Spausdintose etiketėse arba kai vietos mažai, 32 simbolių eilutė be brūkšnelių yra kompaktiškesnė.
  • Kai identifikatorius naudojamas programavimo kode kaip konstanta arba raktas, brūkšneliai gali trukdyti.

Didžiosios raidės pakeičia šešioliktainius simbolius a–f į A–F. Nors UUID standartas nenumato konkrečios raidžių didžiosios/mažosios raidžių politikos, praktikoje:

  • Mažosios raidės yra dažniau naudojamos ir laikomos standartu.
  • Didžiosios raidės gali būti naudojamos dėl skaitymo aiškumo arba, kai sistema reikalauja didžiųjų raidžių.
  • Svarbu: didžiosios ir mažosios raidės UUID lyginant turėtų būti laikomos lygiavertėmis – 550e8400-e29b-41d4-a716-446655440000 ir 550E8400-E29B-41D4-A716-446655440000 yra tas pats identifikatorius.

Dažniausiai užduodami klausimai

Ar UUID v4 yra tikrai atsitiktinis? Taip, jei generavimas naudoja kriptografiškai saugų atsitiktinių skaičių generatorių. Šiame puslapyje naudojamas crypto.randomUUID, kuris yra saugus ir atsitiktinis. Tačiau ne visi programavimo kalbų atsitiktinių skaičių generatoriai yra tinkami UUID v4 generavimui – pvz., Python random modulis nėra saugus kriptografiniams tikslams.

Ar galiu naudoti UUID v4 kaip pirminį raktą MySQL duomenų bazėje? Galite, bet turėkite omenyje, kad dėl atsitiktinio pobūdžio B-medžio indeksas fragmentuosis. Jei rašymo operacijos yra dažnos, apsvarstykite UUID v7 arba ULID. Jei rašymo operacijų nedaug, UUID v4 yra priimtinas.

Kuo skiriasi UUID v4 ir UUID v7? UUID v4 naudoja 122 bitus atsitiktinumo be laiko informacijos. UUID v7 turi 48 bitų laiko dalį (milisekundžių tikslumu) ir 74 bitus atsitiktinumo. Dėl laiko dalies UUID v7 yra rūšiuojamas pagal sukūrimo laiką, todėl jis mažiau fragmentuoja indeksus.

Ar didžiosios raidės turi įtakos unikalumui? Ne. Didžiosios raidės A–F yra tik vizualiai skirtingos nuo mažųjų a–f. Jie reiškia tas pačias šešioliktaines reikšmes. Unikalumą lemia bitų seka, o ne raidžių dydis.

Kiek laiko užtrunka sugeneruoti 100 UUID v4? Šimtą UUID v4 naršyklėje sugeneruojama per milisekundžių dalis. Procesas vyksta lokaliai, nereikia jokio tinklo užklausos. Pati generavimo operacija yra labai greita.

Ar galiu naudoti UUID v4 URL? Taip, bet jei naudojate brūkšnelius, jie gali būti netinkami kai kuriuose URL kontekstuose. Geriausia naudoti variantą be brūkšnelių (32 simboliai) arba koduoti URL (pakeičiant brūkšnelius, jei reikia). UUID v4 be brūkšnelių yra saugus URL, nes jame nėra specialiųjų simbolių.