ULID ģenerators

Ģenerējiet ULID tiešsaistē: 26 rakstzīmju Crockford Base32 ID ar 48 bitu laiku un 80 nejaušiem bitiem.

Formāts
Ģenerētie ID
Gatavs. Ģenerējiet ULID savā pārlūkprogrammā.

Kā šis ID tiek veidots

Izkārtojums
26 Crockford Base32 rakstzīmes: 10 laika rakstzīmes, kam seko 16 nejaušas rakstzīmes.
Entropija
80 nejauši biti pēc 48 bitu milisekundes laika zīmoga.
Laiks
Jā. Pirmās 10 rakstzīmes kodē milisekundes laiku, un leksiskā secība seko laikam.
Kolīzijas risks
Nejaušajai beigu daļai ir 80 biti; risks galvenokārt ir saistīts ar to, cik daudz ID tiek izveidots vienā un tajā pašā milisekundē.
Piemērs
01M12BRQ37EG1AHTAQCZ7V3F2Q

Jūsu ID tiek ģenerēti lokāli, izmantojot spēcīgu pārlūkprogrammas nejaušību. Nekas netiek sūtīts uz BroBroGo.

Biežāk uzdotie jautājumi

Kam ir piemērots ULID?

ULID ir kompakts, URL draudzīgs un kārtojams pēc laika kā vienkāršs teksts, kas ir noderīgi žurnāliem (logs), objektu atslēgām un ierakstiem, kurus jākārto pēc izveides laika.

Vai ULID ir tas pats, kas UUID v7?

Nē. Abi ietver milisekundes laiku, taču ULID izmanto Crockford Base32 un 26 rakstzīmes, savukārt UUID v7 saglabā standarta UUID sešpadsmitnieku formu.

Kas ir ULID un kā tas atšķiras no citiem identifikatoriem?

ULID (Universally Unique Lexicographically Sortable Identifier) ir 26 rakstzīmju garš identifikators, kas veidots no Crockford bāzes‑32 alfabēta. Tas ir īsāks par UUID (36 rakstzīmes) un automātiski ir reģistrjutīgs — lielie un mazie burti tiek traktēti vienādi. Atšķirībā no UUID, ULID nav defises, un tas ir URL‑drošs bez jebkādas izbēgšanas. Pirmās 10 rakstzīmes kodē 48 bitu laikspiedolu ar milisekundes precizitāti, bet atlikušās 16 rakstzīmes (80 biti) ir nejauši. Kopējais bitu apjoms ir 128, tāpat kā UUID, bet attēlojums ir kompaktāks.

Šī lapa piedāvā ULID ģenerēšanu kā vienu no identifikatoru formātiem. Lietotājs izvēlas ULID, norāda vēlamo identifikatoru skaitu (1–100), un rīks acumirklī izveido sarakstu. Katrs ULID ir 26 rakstzīmju virkne, kuru var nokopēt atsevišķi vai visus reizē. Rīks neparāda pārslēgšanas opcijas “lielie burti” vai “defises”, jo ULID pēc būtības ir reģistrjutīgs un defises nesatur.

Kā darbojas ULID ģenerators šajā lapā?

Lapa ir vienkārša: formāta izvēlē iestata “ULID”, skaita laukā ievada veselu skaitli no 1 līdz 100, un nospiež pogu. Rezultātā parādās identifikatoru saraksts. Rīks parāda arī statusa ziņojumus: “Ready.” (sākumā), “Generated.” (pēc ģenerēšanas) un “Copied all!” (kad visi identifikatori ir nokopēti starpliktuvē). Noklikšķinot uz kāda atsevišķa ULID, tas tiek nokopēts starpliktuvē.

Jebkuru opciju maiņa (formāts, skaits) automātiski atkārto ģenerēšanu. Identifikatori tiek radīti lokāli pārlūkprogrammā, izmantojot crypto.getRandomValues() — spēcīgu pārlūkprogrammas nejaušības avotu. Nekas netiek sūtīts uz serveri. Tas nozīmē, ka dati paliek lietotāja datorā, un privātums netiek apdraudēts.

ULID iekšējā uzbūve – 128 biti, 48+80

ULID pamatā ir 128 bitu vērtība, kas sadalīta divās daļās:

  • 48 bitu laikspiedols (pirmās 10 rakstzīmes). Tas kodē milisekunžu skaitu kopš Unix epoch (1970. gada 1. janvāra). Laikspiedols tiek attēlots Crockford bāzes‑32 formātā, kas ļauj 10 rakstzīmēs ietilpināt līdz pat 281 474 976 710 655 milisekundēm — aptuveni 8926 gadiem.
  • 80 bitu nejaušā daļa (atlikušās 16 rakstzīmes). Tā tiek ģenerēta ar kriptogrāfiski drošu nejaušības ģeneratoru.

Crockford bāzes‑32 alfabēts satur ciparus 0–9 un burtus A–Z, izņemot I, L, O, U. Šie izņēmumi novērš vizuālu neskaidrību — piemēram, 1 un I var sajaukt, tāpēc I ir izlaists. Tāpat tiek izlaisti L un O, lai nerastos pārpratumi ar 1 un 0. Šī alfabēta dēļ ULID ir reģistrjutīgs: “a” un “A” tiek lasīti vienādi, tāpēc tos var rakstīt jebkurā reģistrā.

Eksperimentāls piemērs:
Laikspiedols 0x1F8A4B3C2D1E (aptuveni 2025. gada janvāris) Crockford bāzes‑32 kļūst par 01ARZ3NDEK. Pievienojot nejaušus 80 bitus, iegūst pilnu ULID, piemēram, 01ARZ3NDEKTSV4WPPQ1YHRM7A.

ULID salīdzinājums ar UUID v4 un UUID v7

Īpašība ULID UUID v4 UUID v7
Garums (rakstzīmes) 26 36 36
Defises Nav 4 defises 4 defises
Reģistrjutīgums Nē (reģistratkarīgs) Nē (reģistratkarīgs)
Laikspiedols 48 bitu, milisekundes Nav 48 bitu, milisekundes (pēc ISO 8601)
Neatkarīgā daļa 80 bitu, nejauša 122 bitu, nejauša 74 bitu, nejauša + fiksēti biti
Šķirojams pēc laika Jā (leksikogrāfiski) Jā (leksikogrāfiski)
URL‑drošs Jā (visas rakstzīmes ir RFC 3986 neatliekamās) Jā (izņemot {} utt.)
Kopsumma biti 128 128 128

Galvenā atšķirība: ULID ir īsāks un bez defisēm, tāpēc to ir vieglāk manuāli pierakstīt un ievietot URL. Turklāt ULID šķirojams pēc laika – pēc alfabētiskās kārtības tas atbilst to izveides secībai. UUID v4 ir pilnīgi nejaušs, un tos nevar šķirot. UUID v7 arī satur laikspiedolu, bet tam ir 122 biti kopā, tāpēc tas ir garāks un ar defisēm.

Sortēšanas ierobežojumi ar ULID:
Ja divi identifikatori tiek ģenerēti vienā un tajā pašā milisekundē, to secība nav garantēta – nejaušā daļa var sakārtoties jebkurā veidā. Tas nozīmē, ka ULID nav piemērots absolūtai secības garantijai, ja ģenerēšana notiek ātrāk par vienu milisekundi. Tomēr praksē tas ir pietiekami daudzos lietojumos.

Sadursmju iespējamība:
80 bitu nejaušības daļa dod 2^80 ≈ 1,2 × 10^24 iespējamo vērtību. Lai sadursmes iespējamība būtu 50%, būtu jāģenerē aptuveni 2^40 ≈ 1,1 × 10^12 ULID vienā milisekundē. Reālās sistēmās šāds ātrums ir reti sasniedzams, tāpēc sadursmju risks ir niecīgs.

Lietošanas scenāriji – kam ULID ir noderīgs?

  • Tīmekļa un mobilo lietotņu izstrādātājiem, kuri vēlas īsākus, URL‑drošus identifikatorus, kurus var šķirot pēc radīšanas laika bez atsevišķas laika kolonnas datubāzē.
  • Datubāzu administratoriem, kas projektē primārās atslēgas, lai uzlabotu B‑koku veiktspēju, jo jauni ULID ir aptuveni monotoni pieaugoši – atšķirībā no nejaušiem UUID, kas izraisa lapu sadalīšanu.
  • Sistēmu arhitektiem, kas veido izkliedētas sistēmas, kur identifikatoriem jābūt unikāliem daudzos mezglos, bet arī šķirojamiem un kompaktiem.
  • API izstrādātājiem, kuri vēlas publiskos identifikatorus, kas ir grūti uzminēti, bet tomēr cilvēkiem draudzīgi – nav reģistrjutīguma neskaidrību, nav defises.
  • Ikvienam, kam UUID šķiet pārāk garš vai neērts un vajadzīgs aizstājējs, kas saglabā 128 bitu telpu, bet ir īsāks.

Biežāk uzdotie jautājumi

1. Vai ULID ir pilnīgi šķirojams pēc laika?
Jā, leksikogrāfiskā kārtošana atbilst izveides secībai, ja vien identifikatori nav radīti vienā milisekundē. Šādos gadījumos kārtošana nav garantēta, bet parasti tas nav būtisks ierobežojums.

2. Vai ULID ģenerētājs ir drošs privātumam?
Jā. Visi identifikatori tiek radīti lokāli pārlūkprogrammā, izmantojot crypto.getRandomValues(). Nekas netiek sūtīts uz serveri, tāpēc dati paliek lietotāja datorā.

3. Kāpēc ULID nav defises?
Defises UUID tiek izmantotas, lai atdalītu versijas un variantu, bet ULID strukturēts vienkāršāk – nav nepieciešams atdalīt laikspiedola un nejaušās daļas. Tāpat pēc Crockford specifikācijas defises nav daļa no koda.

4. Vai varu izmantot ULID kā primāro atslēgu SQL datubāzē?
Jā, un tas ir ieteicams scenārijs, kad vēlaties izvairīties no UUID radītā indeksa sadalīšanās. Tomēr jāpārliecinās, ka datubāzes tips atbalsta 26 rakstzīmju varchar vai char. ULID ir arī saderīgs ar UUID datu tipiem, ja to pārveido par 128 bitu vērtību.

5. Kāpēc ULID ir tikai 26 rakstzīmes, bet UUID ir 36?
Crockford bāzes‑32 kodē 5 bitus vienā rakstzīmē (jo 2^5 = 32). 128 biti / 5 biti rakstzīmē = 25,6 → nepieciešamas 26 rakstzīmes. UUID izmanto heksadecimālo kodējumu (4 biti uz rakstzīmi) plus defises, tādējādi 128 / 4 = 32 rakstzīmes + 4 defises = 36.

6. Vai ULID ir labāks par UUID v7?
Abi ir līdzīgi – satur laikspiedolu un ir šķirojami. ULID ir īsāks un bez defisēm, kas var būt ērtāk, ja identifikators jāpieraksta vai jānosūta tālrunī. UUID v7 ir standartizēts (RFC 9562) un var būt vairāk saderīgs ar esošajām bibliotēkām, bet ULID ir arī labi dokumentēts un atbalstīts dažādās platformās.