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.