Gjenerues i ULID

Gjeneroni ULID online: ID me 26 karaktere Crockford Base32 me kohë 48-bitëshe dhe 80 bite rastësie.

Formati
ID-të e gjeneruara
Gati. Gjeneroni ULID në shfletuesin tuaj.

Si ndërtohet ky ID

Struktura
26 karaktere Crockford Base32: 10 karaktere kohe të ndjekura nga 16 karaktere të rastësishme.
Entropia
80 bite rastësie pas stampës kohore 48-bitëshe në milisekonda.
Koha
Po. 10 karakteret e para kodojnë kohën në milisekonda, dhe renditja leksikore ndjek kohën.
Rreziku i kolizionit
Pjesa fundore e rastësishme ka 80 bite; rreziku lidhet kryesisht me numrin e ID-ve që krijoni brenda të njëjtës milisekondë.
Shembull
01M12BRQK2JHA0ZRGET6XCTYPN

ID-të tuaja gjenerohen lokalisht me rastësi të fortë të shfletuesit. Asgjë nuk dërgohet në BroBroGo.

Pyetjet e shpeshta

Për çfarë shërben ULID?

ULID është kompakt, i përshtatshëm për URL dhe i renditshëm sipas kohës si tekst i thjeshtë, gjë që është e dobishme për regjistrat (logs), çelësat e objekteve dhe të dhënat që duhet të renditen sipas kohës së krijimit.

A është ULID i njëjtë me UUID v7?

Jo. Të dy përfshijnë kohën në milisekonda, por ULID përdor Crockford Base32 dhe 26 karaktere, ndërsa UUID v7 ruan strukturën standarde heksadecimal të UUID.

Si funksionon gjeneruesi i ULID-ve në këtë faqe

Kjo faqe ju lejon të krijoni identifikues unikë në formatin ULID duke zgjedhur thjesht numrin e tyre (nga 1 deri në 100) dhe duke klikuar për t’i gjeneruar. Çdo ULID shfaqet si një varg 26 karakterësh, pa shkronja të mëdha/të vogla të ndjeshme dhe pa viza. Mund të kopjoni një ULID të veçantë duke klikuar mbi të ose të gjithë listën me një klikim, i cili ndryshon statusin në "Copied all!". Të gjitha gjenerimet ndodhin lokalisht në shfletuesin tuaj, duke përdorur crypto.getRandomValues() – asnjë të dhënë nuk dërgohet në një server.

Pse ULID ndryshon nga UUID-të dhe formatet e tjera

Dallimi kryesor i kësaj faqeje është se ULID prodhon identifikues më të shkurtër se UUID (26 karaktere kundrejt 36), përdor vetëm alfabetin e Crockford base32 – duke i bërë ato të pandjeshme ndaj shkronjave të mëdha/vogla dhe pa viza. ULID-të janë të renditura leksikografikisht sipas kohës së krijimit, sepse 10 karakteret e para kodojnë një vulë kohore me saktësi milisekondë. Ato janë gjithashtu të sigurta për URL pa pasur nevojë për ikodim. Ndryshe nga faqet e tjera të të njëjtit mjet, këtu nuk ka çelësa për të ndryshuar shkronjat në kapitel ose për të shtuar viza, sepse ULID në natyrë i ka këto veti të ngulitura.

Struktura e brendshme e një ULID-je: 48 bit kohë dhe 80 bit rastësi

Një ULID përfaqëson gjithsej 128 bit, të ndarë në dy pjesë:

  • 10 karakteret e para (48 bit): Kodojnë kohën në milisekonda që nga epoka Unix (1 janar 1970). Kjo vulë kohore lejon renditjen sipas krijimit dhe mbulon rreth 8.957 vjet përpara se të mbushet, duke filluar nga data 10889 pas Krishtit për epokën Unix. Megjithatë, për identifikuesit e gjeneruar brenda së njëjtës milisekondë, renditja nuk është e garantuar.
  • 16 karakteret e mbetura (80 bit): Janë pjesë e rastësishme, e krijuar nga një burim i fortë rastësie kriptografike në shfletues.

Këto 128 bit kodifikohen duke përdorur alfabetin Crockford base32, i cili përfshin shifrat 0–9 dhe shkronjat A–Z, me përjashtim të I, L, O, U (për të shmangur ngatërrimin vizual me 1, 0, dhe shkronja të tjera). Ky alfabet është i pandjeshëm ndaj shkronjave të mëdha/të vogla – p.sh., "01aBcDeFgH1234567890ABCDEF" dhe "01abcdefgh1234567890abcdef" konsiderohen të njëjtë, megjithëse mjeti gjeneron gjithmonë shkronja kapitel.

Renditja sipas kohës dhe kufizimet

Për shkak se 10 karakteret e para përfaqësojnë një vulë kohore në rritje, ULID-të janë leksikografikisht të renditura sipas kohës së krijimit. Kjo është e dobishme për bazat e të dhënave që përdorin indekse B-tree – futja e regjistrimeve me çelësa që rriten në mënyrë monotonike përmirëson performancën e futjes në krahasim me UUID-të e rastit (p.sh., UUID v4). Megjithatë, nëse gjeneroni shumë ULID brenda të njëjtës milisekondë, renditja e tyre relative nuk është e garantuar, sepse pjesa e rastit nuk është domosdoshmërisht në rritje. Nëse keni nevojë për renditje të saktë edhe brenda të njëjtës milisekondë, duhet të përdorni një mekanizëm shtesë (p.sh., numër sekuence).

Krahasimi me UUID v4 dhe UUID v7

Karakteristikë ULID UUID v4 UUID v7
Gjatësia e vargut 26 karaktere 36 karaktere (me 4 viza) 36 karaktere (me 4 viza)
Bit gjithsej 128 128 128
Vula kohore Po (48 bit, milisekonda) Jo (rastësi e plotë) Po (48 bit, milisekonda)
Alfabeti Crockford base32 (0-9, A-Z minus I,L,O,U) Heksadecimal (0-9, a-f) Heksadecimal (0-9, a-f)
Ndjeshmëri ndaj shkronjave Jo (e pandjeshme) Po (shkronjat e mëdha/vogla janë të ndryshme në teori, por praktikisht shpesh konvertohen) Po
Vizat Jo Po, në 4 vende Po, në 4 vende
Siguri për URL Po (pa ikodim) Jo (vizat janë të lejuara, por heksadecimali nuk kërkon ikodim; 36 karaktere më të gjata) Jo (vizat janë të lejuara)
Renditja sipas kohës Leksikografike (vetëm për kohë të ndryshme) Jo Leksikografike (për kohë të ndryshme)

ULID është më i shkurtër dhe më i lexueshëm për njerëzit (pa viza, pa ngatërresa me shkronja të mëdha/të vogla). UUID v7 ofron gjithashtu renditje sipas kohës, por ruan vizat dhe gjatësinë 36 karaktere. Për sistemet ku hapësira e ruajtjes ose komoditeti i kopjimit manual janë të rëndësishme, ULID ka avantazhin.

Probabiliteti i përplasjes (collision) dhe rastësia e fortë

Pjesa e rastësishme e një ULID-je ka 80 bit, që jep 2^80 vlera të mundshme (rreth 1.21 × 10^24). Edhe nëse gjeneroni miliona ULID, probabiliteti i përplasjes mbetet jashtëzakonisht i ulët. Për shembull, duke përdorur formulën e ditëlindjes: për të pasur 50% shanse për një përplasje, ju duhen rreth 2^(80/2) = 2^40 ≈ 1.1 trilion ULID. Në praktikë, me gjenerim lokal duke përdorur crypto.getRandomValues() (burim i fortë kriptografik), rastësia është e cilësisë së lartë dhe e paparashikueshme. Megjithatë, asnjë gjenerues nuk mund të garantojë unicitet absolut – për aplikime kritike, rekomandohet të keni një mekanizëm kontrolli ose të përdorni një ID të vetme për çdo entitet.

Siguria për URL-të dhe përdorimi praktik

ULID përdor vetëm karaktere që janë të pa-rezervuara në RFC 3986 (shifra dhe shkronja të mëdha/të vogla, pa simbole speciale). Kjo do të thotë se nuk keni nevojë të bëni ikodim të përqindjes (%xx) për t’i përdorur në URL. Kjo i bën ato ideale për ID të burimeve në API, për çelësa primarë në baza të dhënash të shpërndara, ose për identifikues të produkteve në faqe interneti.

Një gabim i zakonshëm është të supozohet se ULID-të janë plotësisht të pandjeshëm ndaj shkronjave. Në fakt, ato janë të pandjeshme ndaj shkronjave vetëm në kuptimin e alfabetit Crockford – përpunuesit duhet t’i konvertojnë në një formë normale (zakonisht në shkronja kapitel) përpara krahasimit. Nëse dy sisteme ruajnë ULID-in në formate të ndryshme shkronjash dhe i krahasojnë drejtpërdrejtë, ato mund të konsiderohen të ndryshëm. Prandaj, praktika më e mirë është të konvertoni gjithmonë në shkronja kapitel përpara ruajtjes ose krahasimit.

Pyetje të shpeshta

1. A mund të gjeneroj më shumë se 100 ULID në një herë? Jo. Faqja pranon vetëm numra midis 1 dhe 100. Për të marrë më shumë, duhet të klikoni përsëri për të gjeneruar një grup të ri.

2. Pse nuk mund të ndryshoj nëse ULID-të shfaqen me shkronja të mëdha apo të vogla? Sepse ULID është i pandjeshëm ndaj shkronjave në natyrë. Mjeti gjeneron gjithmonë me shkronja kapitel për lexueshmëri, por çdo interpretues i duhur duhet t’i trajtojë ato në mënyrë të pandjeshme. Nuk ka nevojë për një çelës të tillë.

3. A garantohet që ULID-të e gjeneruar brenda së njëjtës milisekondë do të jenë të renditur sipas radhës së gjenerimit? Jo. Pjesa e rastit nuk është domosdoshmërisht në rritje, prandaj renditja e tyre e saktë nuk mund të parashikohet. Nëse keni nevojë për renditje të saktë në nivel milisekondë, duhet të shtoni një numër sekuence ose të përdorni një algoritëm tjetër.

4. A janë ULID-të më të sigurt se UUID-të për sa i përket hamendjes? Të dyja kanë 128 bit, por ULID zbulon vulën kohore në 48 bitet e para. Kjo e bën më të lehtë për një sulmues të hamendësojë një ID të mundshme duke ditur kohën e krijimit. Për aplikime ku fshehtësia është e rëndësishme (p.sh., ID të sesioneve), rekomandohet të përdorni një ID rastësore pa vulë kohore, si UUID v4.

5. Si kopjoj të gjithë listën njëherësh? Pas gjenerimit, klikoni butonin "Copy All" ose pranë listës. Statusi ndryshon në "Copied all!" për të konfirmuar.

6. A dërgohen të dhënat e mia në ndonjë server kur gjeneroj ULID? Jo. Gjithçka ndodh në shfletuesin tuaj duke përdorur crypto.getRandomValues(). Asnjë ULID, as numri i kërkuar, nuk dërgohet askund. Kjo garanton privatësinë e plotë të identifikuesve tuaj.