Whiz Tools

ULID ģenerators

Ģenerētais ULID:

ULID struktūra


Laika zīmogs (10 rakstzīmes)

Izlases (16 rakstzīmes)

ULID ģenerators

Ievads

ULID (Universāli unikāls leksikogrāfiski kārtojams identifikators) ir unikāls identifikators, kas apvieno laika zīmogu ar nejaušiem datiem, lai izveidotu 26 zīmju virkni. ULID ir paredzēti, lai būtu leksikogrāfiski kārtojami, saglabājot augstu unikāluma un nejaušības pakāpi.

ULID struktūra

ULID sastāv no divām galvenajām daļām:

  1. Laika zīmogs (10 zīmes): Pirmās 10 zīmes attēlo laiku milisekundēs kopš Unix Epoch (1970-01-01).
  2. Nejaušība (16 zīmes): Atlikušās 16 zīmes tiek ģenerētas, izmantojot kriptogrāfiski drošus nejaušos datus.

Rezultātā iegūtā 26 zīmju virkne tiek kodēta, izmantojot Krokforda bāzes32 alfabētu (0-9 un A-Z, izslēdzot I, L, O un U).

Formulas

ULID tiek ģenerēts, izmantojot šādas darbības:

  1. Ģenerēt 48 bitu laika zīmogu (milisekundes kopš Unix Epoch).
  2. Ģenerēt 80 bitus kriptogrāfiski drošu nejaušu datu.
  3. Kodēt apvienotos 128 bitus, izmantojot Krokforda bāzes32 kodēšanu.

Aprēķins

ULID ģenerators veic šādas darbības:

  1. Iegūst pašreizējo laiku milisekundēs.
  2. Ģenerē 10 nejaušas baitus (80 bitus), izmantojot kriptogrāfiski drošu nejaušu skaitļu ģeneratoru.
  3. Apvieno laika zīmogu un nejaušos datus 128 bitu veselā skaitļa formātā.
  4. Kodē 128 bitu veselā skaitļa vērtību, izmantojot Krokforda bāzes32 kodēšanu.

Lietošanas gadījumi

ULID ir noderīgi dažādās situācijās, tostarp:

  1. Datu bāzes atslēgas: ULID var izmantot kā unikālus identifikatorus datu bāzes ierakstiem, nodrošinot unikālumu un kārtojamību.
  2. Izplatītās sistēmas: Izplatītās vidēs ULID var ģenerēt bez koordinācijas starp mezgliem.
  3. Žurnālu un izsekošanas sistēmas: ULID var izmantot, lai marķētu žurnālu ierakstus vai izsekošanas notikumus, nodrošinot kārtojamu un unikālu identifikatoru.
  4. URL draudzīgi identifikatori: ULID ir droši URL un var tikt izmantoti tīmekļa lietojumprogrammās kā identifikatori URL.

Alternatīvas

Lai gan ULID ir daudzpusīgi, ir arī citas unikālu identifikatoru sistēmas, ko apsvērt:

  1. UUID (Universāli unikāls identifikators): 128 bitu identifikators, kas nesatur laika zīmogu.
  2. KSUID (K-kārtojams unikāls identifikators): Līdzīgs ULID, bet ar atšķirīgu laika zīmoga kodēšanu.
  3. Snoflakes ID: Twitter izplatītā unikālo ID ģenerēšanas sistēma, kurā ietilpst laika zīmogs un darba ID.

Vēsture

ULID tika ieviests 2016. gadā Alizain Feerasta kā alternatīva UUID. Tie tika izstrādāti, lai risinātu dažas UUID ierobežojumus, īpaši attiecībā uz kārtojamību un lasāmību. ULID specifikācija ir palikusi stabila kopš tās ieviešanas, un ir pieejamas dažādas īstenojumi dažādās programmēšanas valodās.

Piemēri

Šeit ir daži koda piemēri, kā ģenerēt ULID dažādās programmēšanas valodās:

// JavaScript īstenojums
function generateULID() {
  const timestamp = Date.now().toString(36).padStart(10, '0');
  const randomness = crypto.getRandomValues(new Uint8Array(16))
    .reduce((acc, byte) => acc + byte.toString(36).padStart(2, '0'), '');
  return (timestamp + randomness).toUpperCase();
}

console.log(generateULID());
## Python īstenojums
import time
import secrets
import base64

def generate_ulid():
    timestamp = int(time.time() * 1000).to_bytes(6, byteorder="big")
    randomness = secrets.token_bytes(10)
    return base64.b32encode(timestamp + randomness).decode("ascii").lower()

print(generate_ulid())
// Java īstenojums
import java.security.SecureRandom;
import java.time.Instant;

public class ULIDGenerator {
    private static final SecureRandom random = new SecureRandom();
    private static final char[] ENCODING_CHARS = "0123456789ABCDEFGHJKMNPQRSTVWXYZ".toCharArray();

    public static String generateULID() {
        long timestamp = Instant.now().toEpochMilli();
        byte[] randomness = new byte[10];
        random.nextBytes(randomness);

        StringBuilder result = new StringBuilder();
        // Kodēt laika zīmogu
        for (int i = 9; i >= 0; i--) {
            result.append(ENCODING_CHARS[(int) (timestamp % 32)]);
            timestamp /= 32;
        }
        // Kodēt nejaušību
        for (byte b : randomness) {
            result.append(ENCODING_CHARS[b & 31]);
        }
        return result.toString();
    }

    public static void main(String[] args) {
        System.out.println(generateULID());
    }
}

Šie piemēri demonstrē, kā ģenerēt ULID JavaScript, Python un Java valodās. Jūs varat pielāgot šīs funkcijas savām konkrētajām vajadzībām vai integrēt tās lielākās sistēmās, kurām nepieciešami unikāli identifikatori.

Atsauces

  1. "ULID specifikācija." GitHub, https://github.com/ulid/spec. Piekļuve 2024. gada 2. augustā.
  2. "Krokforda bāzes32 kodēšana." Bāzes32 kodēšana, http://www.crockford.com/base32.html. Piekļuve 2024. gada 2. augustā.
  3. "UUID pret ULID." Stack Overflow, https://stackoverflow.com/questions/54222235/uuid-vs-ulid. Piekļuve 2024. gada 2. augustā.
Atsauksmes