UUID v7 generatorius

Generuokite UUID v7 reikšmes internetu: pagal laiką rūšiuojami UUID su 48 bitų laiko žyma milisekundėmis ir 74 atsitiktiniais bitais.

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

Kaip sukuriamas šis ID

Struktūra
48 bitų Unix laiko žyma milisekundėmis, 7 versijos bitai, RFC varianto bitai ir atsitiktinis užpildymas.
Entropija
74 atsitiktiniai bitai šioje realizacijoje; monotoninio skaitiklio nėra.
Laikas
Taip. Pirmieji 48 bitai užkoduoja sukūrimo laiką, todėl ID yra rūšiuojami pagal laiką tarp skirtingų milisekundžių.
Kolizijos rizika
Per vieną milisekundę kolizijos priklauso nuo 74 atsitiktinių bitų; esant itin dideliam kiekiui per tą pačią milisekundę, reikėtų naudoti koordinuotą ID tarnybą.
Pavyzdys
01a044bc-5c4e-7882-98cc-5a9bc4d9b59d

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

DUK

Kodėl verta rinktis UUID v7, o ne UUID v4?

UUID v7 išlaiko UUID pavidalą, tačiau yra rūšiuojamas pagal laiką, o tai padeda žurnalams, duomenų bazių indeksams ir įvykių srautams išlikti apytiksliai chronologiškiems.

Ar UUID v7 paslepia sukūrimo laiką?

Ne. Laiko žyma yra ID dalis. Naudokite UUID v4 arba NanoID, jei jums reikia nepermatomo identifikatoriaus be laiko duomenų.

UUID v7 formato sandara ir laiko žymos svarba

UUID v7 nėra dar vienas atsitiktinis identifikatorius. Jo struktūra sąmoningai sukurta taip, kad pirmieji 48 bitai būtų 48 bitų Unix milisekundžių laiko žyma. Tai reiškia, kad kiekvienas sugeneruotas UUID v7 prasideda skaičiumi, kuris atitinka tikslią sukūrimo akimirką (milisekundės tikslumu). Likę 80 bitų užpildomi kriptografiškai stipria atsitiktine seka. Galutinis rezultatas – 128 bitų identifikatorius, tekstu užrašomas kaip 36 simbolių eilutė, pavyzdžiui: 018f3a7b-1234-7abc-def0-123456789abc.

Šis laiko žymos įdėjimas į pradžią nėra atsitiktinis. Duomenų bazėse, kurios naudoja B-medžio indeksus (pvz., PostgreSQL, MySQL, SQL Server), įrašai dažniausiai rūšiuojami pagal pirminį raktą. Jei raktai yra atsitiktiniai (kaip UUID v4), nauji įrašai šokinėja po visą indeksą, sukeldami fragmentaciją ir lėtindami įrašymą. UUID v7 įrašai, priešingai, atsiranda arti vienas kito – jų pradžia laiko atžvilgiu yra monotoniškai didėjanti. Tai žymiai pagerina įrašymo našumą ir sumažina indekso priežiūros naštą.

Svarbu pabrėžti: nors UUID v7 rūšiuojami pagal sukūrimo laiką, jie negriežtai garantuoja tvarką tų pačių milisekundžių ribose. Jei tame pačiame milisekundyje sugeneruojami keli identifikatoriai, jų tarpusavio eiliškumas gali skirtis nuo tikrosios sukūrimo sekos. Tai sąmoningas kompromisas – išlaikomas paralelinis generavimas be centrinio laikrodžio derinimo.

Kaip veikia UUID v7 generatorius – nuo skaičiaus iki identifikatoriaus

Šios svetainės puslapyje vartotojas turi tris pagrindinius parametrus: kiekį (1–100), didžiųjų raidžių naudojimą ir brūkšnelių įjungimą-išjungimą. Pakeitus bet kurį iš jų, generatorius iškart pergeneruoja visą sąrašą. Nėra mygtuko „Generuoti“ – sistema reaguoja į kiekvieną pakeitimą.

Kiekvienas UUID v7 gimsta naršyklėje, naudojant kriptografinį atsitiktinumą (crypto.getRandomValues). Joks identifikatorius nesiunčiamas į BroBroGo serverius. Tai reiškia, kad net jei jūsų tinklas nepasiekiamas, generatorius veiks – visi skaičiavimai vyksta kliento pusėje.

Formuojant konkretų UUID v7, pirmiausia paimama dabartinė Unix laiko žyma milisekundėmis (pvz., 1742812345678). Ji užrašoma kaip 48 bitų sveikasis skaičius. Tada prie jos prijungiami 74 bitai atsitiktinių duomenų, o dar 6 bitai rezervuojami versijai ir variantui pagal RFC 9562 specifikaciją. Galiausiai 128 bitai konvertuojami į šešioliktainį užrašą, įterpiant brūkšnelius standartinėse pozicijose (8-4-4-4-12 simbolių). Jei vartotojas išjungė brūkšnelius, jie praleidžiami – gaunama ištisinė 32 simbolių eilutė. Jei įjungtos didžiosios raidės, visos raidės (a–f) rašomos didžiosiomis.

Vartotojas mato ne tik sąrašą. Po generavimo puslapis rodo būseną „Sugeneruota“ („Generated.“). Jei identifikatoriai nukopijuojami visi iš karto, pasirodo „Nukopijuota viskas!“ („Copied all!“). Spustelėjus atskirą ID, jis nukopijuojamas į mainų sritį.

Kuo šis įrankis skiriasi nuo kitų UUID generatorių?

Dauguma internete randamų UUID generatorių apsiriboja v4 formatu – visiškai atsitiktiniu, be jokios laiko dedamosios. Šis puslapis sąmoningai fokusuojasi į v7, nes būtent šis formatas sprendžia realią praktinę problemą: indeksų fragmentaciją didelėse duomenų bazėse.

Pagrindiniai skirtumai:

  • Laiko žyma – UUID v7 pradžioje įrašyta 48 bitų Unix milisekundžių reikšmė leidžia identifikatorius rūšiuoti pagal sukūrimo laiką. UUID v4 tokio lauko neturi.
  • Nuspėjamumas – nors laiko žyma yra vieša, likusi dalis yra atsitiktinė. Tai užtikrina, kad ID liktų neatskleidžiamas (unguessable). Vien laiku pagrįsti identifikatoriai (pvz., nuoseklūs sveikieji skaičiai) yra lengvai atspėjami.
  • Formatas – UUID v7 visada yra 36 simbolių eilutė (su brūkšneliais) arba 32 simbolių (be brūkšnelių). Tai standartizuota, todėl lengvai atpažįstama ir suderinama su daugeliu sistemų.
  • Sąsaja – šiame puslapyje galima reguliuoti didžiųjų raidžių ir brūkšnelių naudojimą. Tai naudinga, kai reikia laikytis konkrečios konvencijos (pvz., tam tikri duomenų bazių adapteriai reikalauja mažųjų raidžių be brūkšnelių).

Palyginus su ULID, kuris taip pat turi laiko žymą ir atsitiktinumą, UUID v7 turi pranašumą – yra oficialiai standartizuotas (RFC 9562) ir plačiai palaikomas programavimo kalbų bibliotekose. ULID dažnai naudoja base32 kodavimą, o UUID v7 išlieka šešioliktainiu, todėl lengviau dera su esamais UUID apdorojimo įrankiais.

Praktiniai naudojimo atvejai: nuo duomenų bazių iki įvykių sekų

1. Pirminiai raktai duomenų bazėse

Tai akivaizdžiausia UUID v7 paskirtis. Jei kuriate sistemą, kuri veikia keliose mašinose (mikroservisai, šakotas replikavimas), negalite naudoti nuoseklių sveikųjų skaičių – jie susidurtų dėl identiškų reikšmių. UUID v7 leidžia kiekvienam mazgui generuoti unikalius, laike maždaug surikiuotus identifikatorius. Tai ypač vertinga „INSERT-heavy“ sistemose, pvz., įvykių žurnaluose, užsakymų lentelėse ar sekimo duomenyse.

2. Įvykių sekimas ir audito žurnalai

Kiekvienas įvykis gali turėti UUID v7, kurio pirmieji simboliai rodo, kada jis įvyko. Net jei prarandate metaduomenis (pvz., laiko stulpelyje), iš paties ID galite atkurti apytikslę laiko žymą. Tai naudinga blokų grandinių (blockchain) įrašuose, logų agregavime ar verslo įvykių archyvuose.

3. Lygiagrečios sistemos ir paskirstyti raktai

Kai keli procesai vienu metu kuria įrašus, UUID v7 mažina tikimybę, kad jie įrašys į tą patį indekso lapą (dėl laiko artimumo). Tai sumažina užrakinimo (locking) problemas. Tačiau, kaip minėta, esant labai dideliam generavimo greičiui (tūkstančiai per milisekundę), gali prireikti papildomų mechanizmų griežtai tvarkai užtikrinti – pvz., naudoti ULID ar specifinius laiko + eilės numerio derinius.

4. Migracija iš UUID v4

Jei jau turite sistemą su UUID v4, perėjimas prie v7 nėra skausmingas – abu yra 128 bitų identifikatoriai, todėl stulpelių tipai lieka tie patys. Tereikia pakeisti generavimo logiką. Pradžioje galite generuoti v7 tik naujiems įrašams, o seni lieka kaip buvę. Indekso fragmentacija pradės mažėti palaipsniui.

Dėmesio vertos detalės: didžiosios raidės, brūkšneliai ir jų įtaka

UUID standartas apibrėžia, kad identifikatoriai rašomi mažosiomis raidėmis, su brūkšneliais keturiose pozicijose. Tačiau realybėje daugelis sistemų (ypač Windows registras, kai kurios Java bibliotekos) reikalauja didžiųjų raidžių. Šis puslapis leidžia pasirinkti: galima gauti tiek 018f3a7b-1234-7abc-def0-123456789abc, tiek 018F3A7B-1234-7ABC-DEF0-123456789ABC.

Brūkšneliai yra neprivalomi: kai kurie duomenų bazių adapteriai (pvz., PostgreSQL uuid tipo stulpeliai) automatiškai konvertuoja įvestį, o kai kurie reikalauja tikslaus formato. Jei brūkšneliai išjungti, gaunama 32 simbolių eilutė – ji vis dar atitinka UUID, bet jau be vizualaus padalijimo. Tai gali sumažinti saugomų duomenų dydį (nors PostgreSQL ir panašios sistemos viduje vis tiek laiko 128 bitus), bet prarandamas žmogiškasis skaitomumas.

Verta žinoti: keičiant formatą (didžiosios/mažosios raidės, brūkšneliai) tie patys bitai išlieka – tai tik vizualinis pakeitimas. Tačiau jei kopijuosite identifikatorių iš programos, kuri tikisi tam tikro formato, gali kilti neatitikimų. Štai kodėl šis puslapis leidžia greitai perjungti variantus be papildomų transformacijų.

Dažniausiai užduodami klausimai (DUK)

Ar UUID v7 yra 100% unikalus?

Taip, kol naudojamas kriptografiškai stiprus atsitiktinumas, tikimybė susidurti dviem identiškais ID yra astronomiškai maža (128 bitų erdvė). Vienintelė reali grėsmė – jei tas pats procesas toje pačioje milisekundėje sugeneruoja daugiau nei 2^74 (~1.8 × 10^22) ID, bet praktiškai tai nepasiekiama.

Ar galiu naudoti šiuos UUID su PostgreSQL?

Taip. PostgreSQL priima bet kokį 128 bitų UUID, įskaitant v7. Tiesiog įrašykite juos kaip uuid tipo reikšmes. Jei naudojate brūkšnelius, juos galima palikti – PostgreSQL pats juos supranta. Jei be brūkšnelių, kai kurie įrankiai gali reikalauti aiškaus konvertavimo (::uuid).

Kodėl negaliu gauti daugiau nei 100 ID vienu metu?

Tai sąmoningas apribojimas, kad naršyklė nepersikrautų ir vartotojas netyčia nesugeneruotų didžiulio kiekio, kurį būtų sunku peržiūrėti. Jei reikia daugiau, galima generuoti kelis kartus po 100.

Ar šie UUID yra saugūs kriptografiniu požiūriu?

Taip. Atsitiktinė dalis gaunama iš crypto.getRandomValues, kuri naršyklėse yra sertifikuota kaip kriptografiškai stipri. UUID v7 nėra nuspėjamas, net jei žinote laiko žymą, nes likę 80 bitų yra tikrai atsitiktiniai.

Ar galiu naudoti didžiąsias raides saugodamas duomenų bazėje?

Taip, bet dauguma duomenų bazių viduje konvertuoja UUID į mažąsias raides. Pvz., PostgreSQL saugo kaip bitus, o atvaizduodamas visada rodo mažąsias. Jei jums svarbu išlaikyti didžiąsias raides (pvz., dėl išorinės sistemos), reikia saugoti kaip tekstą.

Kuo UUID v7 skiriasi nuo ULID?

ULID naudoja base32 kodavimą, yra 26 simbolių ilgio, ir taip pat turi laiko žymą (48 bitų) bei atsitiktinumą (80 bitų). UUID v7 yra šešioliktainis, 36 simbolių, standartizuotas pagal RFC. ULID yra šiek tiek trumpesnis ir geriau skaitomas žmogaus, bet UUID v7 geriau dera su esamomis UUID bibliotekomis. Abu negarantuoja griežtos tvarkos toje pačioje milisekundėje.

Šis puslapis padeda greitai gauti paruoštus v7 identifikatorius, kuriuos galima įterpti tiesiai į kodą, SQL užklausas ar konfigūracijos failus. Viskas veikia naršyklėje – niekur nesiunčiama, nieko nereikia diegti.