Co to jest ULID?
ULID (Uniwersalnie Unikalny Leksykalnie Sortowalny Identyfikator) to format identyfikatora 128-bitowego zaprojektowany, aby przezwyciężyć ograniczenia UUID. Składa się z:
- Timestamp: 48 bitów precyzji czasu Unix w milisekundach
- Randomness: 80 bitów kryptograficznie bezpiecznych danych losowych
- Encoding: reprezentacja Base32 (26 znaków)
Przykład formatu: 01ARZ3NDEKTSV4RRFFQ69G5FAV
Jak działa ULID
- Generuj 48 bitów dla znacznika czasu (Unix w milisekundach)
- Generuj 80 bitów kryptograficznie bezpiecznych danych losowych
- Połącz znacznik czasu (najbardziej znaczący) z losowością (najmniej znaczącą)
- Zakoduj całą wartość 128-bitową używając alfabetu Base32 Crockforda
- Wynik to 26-znakowy ciąg (pierwsze 10 znaków to znacznik czasu, ostatnie 16 to losowość)
Zalety i uwagi
Advantages | Considerations |
---|---|
|
|
Struktura ULID
Component | Bits | Characters | Description |
---|---|---|---|
Timestamp | 48 bitów | 10 znaków | Znacznik czasu Unix (ms) zakodowany w Base32 |
Randomness | 80 bitów | 16 znaków | Losowe bajty zakodowane w Base32 |
Porównanie ULID i UUID
Feature | ULID | UUID v1 | UUID v4 | UUID v7 |
---|---|---|---|---|
Size | 128 bitów | 128 bitów | 128 bitów | 128 bitów |
Długość ciągu | 26 znaków | 36 znaków | 36 znaków | 36 znaków |
Time-based | ✅ | ✅ | ❌ | ✅ |
Naturalne sortowanie | ✅ | ❌ | ❌ | ✅ |
Bezpieczny dla URL | ✅ | ❌ | ❌ | ❌ |
Ekspozycja adresu MAC | ❌ | ✅ | ❌ | ❌ |
Komponent losowy | ✅ | ❌ | ✅ | ✅ |
Standard kanoniczny | ❌ | ✅ | ✅ | ⚠️ Projekt |
Typowe zastosowania
- Klucze główne bazy danych: Indeksy zoptymalizowane pod kątem wydajności
- Systemy rozproszone: Generowanie bez koordynacji
- APIs: Czyste, bezpieczne dla URL identyfikatory
- Dane szeregów czasowych: Natywne porządkowanie chronologiczne
- Systemy logów: Sortowalne identyfikatory zdarzeń
- Nowoczesne aplikacje: Gdzie ograniczenia UUID są problematyczne
Dlaczego wybrać ULID?
- Sortability: Leksykalne sortowanie według czasu utworzenia
- Bezpieczeństwo URL: Nie wymaga kodowania URL (w przeciwieństwie do UUID z myślnikami)
- Compactness: 26 znaków vs 36 dla UUID
- Niezależność od wielkości liter: Redukuje błędy wprowadzania przez użytkownika
- Monotonicity: Opcjonalne monotoniczne sortowanie w tej samej milisekundzie
- Brak znaków specjalnych: Prosty, wyłącznie alfanumeryczny format
Najczęściej zadawane pytania
Jak ULID wypada na tle UUID v7?
Oba używają znaczników czasu Unix do sortowania i mają komponenty losowe. Kluczowe różnice to kodowanie (Base32 vs hex), format (26 znaków vs 36) oraz standaryzacja (UUID v7 jest w projekcie specyfikacji RFC).
Czy mogę wyodrębnić czas utworzenia z ULID?
Tak. Pierwsze 10 znaków reprezentuje znacznik czasu Unix z precyzją do milisekundy, który można zdekodować i przekształcić do standardowego formatu daty i czasu.
Czy ULID są kompatybilne z polami UUID w bazie danych?
Nie. ULID używają innego formatu i muszą być przechowywane jako ciągi znaków lub dane binarne, a nie w natywnych typach UUID w bazie danych.
Co to jest monotoniczność w ULID?
Niektóre implementacje ULID oferują opcję monotoniczną, która zapewnia sekwencyjny porządek sortowania nawet w tej samej milisekundzie, zwiększając komponent losowy dla ULID utworzonych w tym samym znaczniku czasu.
Jakiego zestawu znaków używa ULID?
ULID używa kodowania Base32 Crockforda (0-9, A-Z z wyłączeniem I, L, O, U), które zostało zaprojektowane, aby zminimalizować pomyłki i błędy transkrypcji podczas ręcznego odczytu lub wprowadzania identyfikatorów.
Resources
Alfabet Base32 Crockforda
Wartość kodowania | Character | Notes |
---|---|---|
0-9 | 0-9 | Cyfry dziesiętne |
10-31 | A-Z | Z wyłączeniem I, L, O, U dla czytelności |
Znaki: 0123456789ABCDEFGHJKMNPQRSTVWXYZ
To kodowanie jest nieczułe na wielkość liter podczas dekodowania (ale ULID są zazwyczaj generowane wielkimi literami).