Skip to content

Darmowy generator ULID — twórz i dekoduj ULID

Twórz, dekoduj i konwertuj ULID online — za darmo i w 100% w przeglądarce. Wyodrębnij osadzony timestamp z dowolnego ULID, konwertuj ULID na UUID i z powrotem, generuj wsadowo, z trybem monotonicznym. Nic nie trafia na serwer.

Bez śledzenia Działa w przeglądarce Bezpłatne
Każdy ULID jest generowany lokalnie za pomocą kryptograficznego RNG Twojej przeglądarki (crypto.getRandomValues). Nic nie jest przesyłane, logowane ani przechowywane.

Każdy ULID używa świeżej 80-bitowej losowości.

Czym jest ULID?

ULID — Universally Unique Lexicographically Sortable Identifier — to 128-bitowy identyfikator stworzony, aby naprawić praktyczną słabość losowego UUIDv4, zachowując jego najlepszą cechę: możesz wygenerować go gdziekolwiek, bez centralnego koordynatora, i mieć pewność, że jest unikalny. Różnica polega na tym, że ULID jest sortowalny według czasu. Jest renderowany jako 26 znaków Crockford Base32, podzielonych na dwie części: pierwszych 10 znaków to 48-bitowy timestamp liczący milisekundy od epoki Unix, a ostatnich 16 znaków to 80 bitów kryptograficznie bezpiecznej losowości. Umieść czas na początku, zakoduj go w alfabecie zachowującym porządek, a identyfikator posortuje się chronologicznie jako zwykły ciąg.

Ten jeden wybór projektowy ma ponadprzeciętne konsekwencje dla baz danych. Losowy klucz główny UUIDv4 ląduje przy każdym wstawieniu w nieprzewidywalnym miejscu indeksu B-tree, co fragmentuje indeks, obciąża cache i powoli pogarsza wydajność zapisów w miarę rośnięcia tabeli. ULID, ponieważ ma prefiks czasowy, ląduje za każdym razem na końcu indeksu lub blisko niego — wstawienia pozostają sekwencyjne, indeks pozostaje zwarty, a skany zakresowe po oknie czasowym stają się tanie. Otrzymujesz bezkoordynacyjne generowanie UUID i lokalność wstawień liczby auto-increment, bez ujawniania możliwego do odgadnięcia sekwencyjnego licznika.

Szczegóły kodowania są zamierzone. Crockford Base32 wyklucza litery I, L, O oraz U, zarówno aby uniknąć wizualnej pomyłki z cyframi 1 i 0, jak i aby uczynić ciąg niewrażliwym na wielkość liter na wejściu. Wynikiem jest 26 znaków bez myślników, które bezpiecznie można umieścić w adresie URL, nazwie pliku lub nagłówku żądania bez escapowania — zauważalnie krótszych niż 36-znakowa postać UUID z myślnikami. 48-bitowy timestamp nie wyczerpie się przez długi czas: może reprezentować daty aż do roku 10889, zanim licznik milisekund się przepełni.

ULID nie są właściwym narzędziem do wszystkiego. Osadzony timestamp ujawnia, kiedy rekord został utworzony, co jest zaletą do debugowania i porządkowania, ale drobnym wyciekiem informacji, jeśli wolisz tego nie ujawniać. A jeśli Twój stos jest związany z typem UUID, możesz preferować UUIDv7, który stosuje tę samą ideę prefiksu czasowego wewnątrz standardowego formatu UUID. Ale gdy chcesz krótkich, bezpiecznych dla adresów URL, sortowalnych identyfikatorów, które możesz wybijać na dowolnym węźle i odczytywać z nich timestamp, ULID jest doskonałym wyborem domyślnym — a ponieważ to tylko 128 bitów, zawsze możesz skonwertować go na UUID i z powrotem za pomocą zakładki Konwertuj tego narzędzia.

// Browser / Node with the `ulid` package
import { ulid, decodeTime } from 'ulid';

const id = ulid();          // e.g. 01KVT0F720ZK9N4T2QX7VR8WMC
const ts = decodeTime(id);  // 1782210600000  ->  2026-06-23T10:30:00.000Z

// Monotonic factory: strictly increasing within the same millisecond
import { monotonicFactory } from 'ulid';
const next = monotonicFactory();
next(1782210600000); // 01KVT0F720ZK9N4T2QX7VR8WMC
next(1782210600000); // 01KVT0F720ZK9N4T2QX7VR8WMD
next(1782210600000); // 01KVT0F720ZK9N4T2QX7VR8WME

Najważniejsze funkcje

Generowanie, dekodowanie i konwersja na jednej stronie

Trzy zakładki obejmują cały przepływ pracy z ULID: wybijaj nowe ULID, dekoduj istniejący, aby odczytać jego timestamp, i konwertuj bezstratnie między ULID a UUID. Większość konkurencyjnych narzędzi robi tylko to pierwsze; tutaj pełna pętla mieści się na jednej stronie.

Dekoder timestampu

Wklej dowolny ULID i odczytaj dokładną milisekundę jego utworzenia — pokazaną w UTC, w Twoim czasie lokalnym oraz jako surowe milisekundy Uniksa — plus 80-bitowy segment losowości. Audytuj czas utworzenia identyfikatora bez żadnego zapytania do bazy danych.

Bezstratna konwersja ULID ↔ UUID

ULID i UUID mają oba po 128 bitów, więc konwersja jest dokładna i odwracalna. Zakładka Konwertuj automatycznie wykrywa, który format wkleiłeś, i produkuje drugi, pozwalając pomostować sortowalny ULID z kolumną lub API typowanym na UUID bez utraty jednego bitu.

Tryb monotoniczny

Potrzebujesz ścisłego porządku nawet dla identyfikatorów utworzonych w tej samej milisekundzie? Tryb monotoniczny zwiększa losowość tak, by każdy ULID był gwarantowanie większy od poprzedniego, utrzymując ciasną pętlę wstawień idealnie posortowaną.

Generowanie wsadowe

Utwórz do 50 ULID naraz i skopiuj cały zestaw przyciskiem Kopiuj wszystko. Idealne do zasilania fixtur testowych, wstawień masowych lub wypełniania tabeli wyszukiwań bez klikania pięćdziesiąt razy.

Własny timestamp

Osadź konkretną chwilę zamiast teraźniejszości — przydatne dla deterministycznych danych testowych lub do antydatowania rekordów podczas migracji przy zachowaniu właściwości sortowalności.

Kryptograficznie bezpieczna losowość

80 losowych bitów pochodzi z crypto.getRandomValues, CSPRNG przeglądarki — nigdy Math.random — więc każdy ULID jest nieprzewidywalny, a kolizje w tej samej milisekundzie są znikomo nieprawdopodobne.

W 100% prywatne, tylko w przeglądarce

Każdy ULID jest generowany, dekodowany i konwertowany w całości na Twoim urządzeniu. Żadnych żądań sieciowych, logowania ani przechowywania — sprawdź to sam w narzędziach deweloperskich → Sieć. Identyfikatory nigdy nie trafiają do strony trzeciej.

Przykłady ULID

Wygeneruj pojedynczy ULID

Tryb: standardowy · Ilość: 1
01KVT0F720ZK9N4T2QX7VR8WMC

ULID to 26 znaków kodowania Crockford Base32. Pierwszych 10 znaków koduje 48-bitowy timestamp w milisekundach, a ostatnich 16 koduje 80 bitów kryptograficznie bezpiecznej losowości pobranej z crypto.getRandomValues. Ponieważ timestamp jest na początku, a Base32 zachowuje kolejność bajtów, ULID wygenerowane później zawsze sortują się po wcześniejszych jako zwykłe ciągi — bez osobnego indeksu. Kliknij Kopiuj, aby pobrać wartość; kliknij Generuj ponownie, aby uzyskać świeży ULID.

Zdekoduj ULID, aby odczytać jego timestamp

01ARYZ6S41TSV4RRFFQ69G5FAV
Timestamp (UTC): 2016-07-30T22:36:16.385Z · Losowość: TSV4RRFFQ69G5FAV

Dekodowanie odwraca pierwszych 10 znaków z powrotem do 48-bitowej wartości w milisekundach osadzonej w chwili utworzenia — tutaj 1469918176385 ms, czyli 2016-07-30T22:36:16.385Z. To kanoniczny przykład ze specyfikacji ULID. Zakładka Dekoduj pokazuje timestamp w UTC i w Twoim czasie lokalnym, surowe milisekundy Uniksa oraz 80-bitowy segment losowości, więc możesz dokładnie sprawdzić, kiedy identyfikator został utworzony, bez żadnego zapytania do bazy danych.

Konwertuj ULID na UUID

01KVT0F720ZK9N4T2QX7VR8WMC
019ef407-9c40-fcd3-5268-57e9f784728c

ULID i UUID mają dokładnie po 128 bitów, więc konwersja jest bezstratna i w pełni odwracalna — te same bity są po prostu ponownie kodowane z Crockford Base32 na szesnastkowy zapis z myślnikami. Zakładka Konwertuj automatycznie wykrywa, czy wkleiłeś ULID, czy UUID, i konwertuje na drugą postać. Pozwala to przechować ULID w kolumnie UUID lub przekazać ULID systemowi, który rozumie tylko UUID, a potem skonwertować z powrotem, gdy znów potrzebujesz sortowalnego ciągu.

Generuj wsadowo monotoniczne ULID

Tryb: monotoniczny · Ilość: 3 (ta sama milisekunda)
01KVT0F720ZK9N4T2QX7VR8WMC
01KVT0F720ZK9N4T2QX7VR8WMD
01KVT0F720ZK9N4T2QX7VR8WME

Gdy wiele identyfikatorów powstaje w tej samej milisekundzie, zwykłe ULID mają wspólny 10-znakowy prefiks czasowy, ale ich losowe końcówki są nieuporządkowane. Tryb monotoniczny to naprawia: w obrębie jednej milisekundy zwiększa poprzednią losowość o jeden, więc każdy ULID jest ściśle większy od poprzedniego, a partia pozostaje idealnie posortowana. Zwróć uwagę, że trzy wartości różnią się tylko ostatnim znakiem (C, D, E) — idealne dla wstawień o dużej przepustowości, gdzie porządek musi się utrzymać nawet przy częstotliwości poniżej milisekundy.

Wygeneruj ULID dla konkretnej daty

Czas własny: 2026-06-23 10:30:00 UTC
01KVT0F720… (komponent czasu 01KVT0F720)

Ustaw własny timestamp, a generator osadzi dokładnie tę chwilę zamiast teraźniejszości, wciąż wypełniając losowość z bezpiecznego RNG. 10-znakowy komponent czasu dla 2026-06-23T10:30:00.000Z to 01KVT0F720. Przydaje się to do zasilania fixtur testowych deterministycznymi, uporządkowanymi czasowo identyfikatorami lub do antydatowania rekordów podczas migracji przy zachowaniu właściwości sortowalności.

Jak używać generatora ULID

  1. 1

    Wybierz tryb generowania

    Tryb standardowy nadaje każdemu ULID świeżą 80-bitową losowość. Tryb monotoniczny gwarantuje, że ULID utworzone w tej samej milisekundzie są ściśle rosnące — wybierz go do wstawień o dużej przepustowości, gdzie porządek musi się utrzymać nawet przy częstotliwości poniżej milisekundy.

  2. 2

    Ustaw ilość, wielkość liter i (opcjonalnie) własny czas

    Wygeneruj od 1 do 50 ULID naraz. Wyjście domyślnie jest WIELKIMI LITERAMI — kanoniczna postać ULID — lub przełącz na małe litery. Pozostaw czas pusty, aby ostemplować teraźniejszość, lub ustaw własny timestamp, aby osadzić konkretną chwilę dla fixtur lub antydatowanych rekordów.

  3. 3

    Wygeneruj i skopiuj

    Kliknij Wygeneruj ULID. Użyj Kopiuj przy dowolnej pojedynczej wartości lub Kopiuj wszystko, aby pobrać całą partię jako tekst rozdzielany znakami nowej linii, gotowy do wklejenia do kodu, pliku z danymi początkowymi lub arkusza kalkulacyjnego.

  4. 4

    Zdekoduj ULID, aby odczytać jego timestamp

    W zakładce Dekoduj wklej dowolny ULID, aby wyodrębnić 48-bitowy timestamp utworzenia w UTC i czasie lokalnym, surowe milisekundy Uniksa oraz 80-bitową losowość — w całości w Twojej przeglądarce, bez potrzeby żadnego zapytania.

  5. 5

    Konwertuj między ULID a UUID

    W zakładce ULID ↔ UUID wklej ULID lub UUID; narzędzie automatycznie wykrywa wejście i bezstratnie konwertuje na drugi format. Przechowuj ULID w kolumnach UUID lub przekaż ULID systemowi obsługującemu tylko UUID i skonwertuj z powrotem, gdy potrzebujesz sortowalnego ciągu.

Common Errors

Traktowanie ULID z tej samej milisekundy jako uporządkowanych

Zwykłe ULID utworzone w jednej milisekundzie mają wspólny prefiks czasowy, ale nieuporządkowane losowe końcówki, więc ich wzajemny porządek jest niezdefiniowany. Jeśli zależysz od ścisłego porządku przy tej częstotliwości, użyj zamiast tego trybu monotonicznego.

✗ Niepoprawne
Tryb standardowy, 3 identyfikatory w jednej ms  →  porządek w obrębie ms jest losowy
✓ Poprawne
Tryb monotoniczny, 3 identyfikatory w jednej ms  →  …WMC < …WMD < …WME

Oczekiwanie, że skonwertowany ULID będzie prawidłowym UUIDv4

Konwersja ULID na postać UUID ponownie koduje te same 128 bitów; nie ustawia pól wersji i wariantu UUID. Wynik jest prawidłowym 128-bitowym ciągiem UUID, ale nie zgłosi się jako wersja 4 lub 7, jeśli biblioteka zbada te bity.

✗ Niepoprawne
uuid.version(ulidToUuid(id))  →  nie 4 (bity należą do ULID)
✓ Poprawne
Traktuj go jako nieprzejrzystą 128-bitową wartość albo wygeneruj zamiast tego prawdziwy UUIDv7

Ręczne wpisywanie małych i, l, o w ULID

Crockford Base32 wyklucza I, L, O oraz U. Dekodery odwzorowują I i L na 1, a O na 0, ale ręczne wpisywanie tych liter w ULID jest podatne na błędy. Kopiuj ULID zamiast przepisywać je ręcznie.

✗ Niepoprawne
01ARYZ6S41TSV4RRFFQ69G5FAO  →  niejednoznaczne O
✓ Poprawne
01ARYZ6S41TSV4RRFFQ69G5FAV  →  tylko kanoniczne znaki

Do czego służą ULID

Klucze główne bazy danych, które pozostają posortowane
Używaj ULID jako kluczy głównych, aby uzyskać bezkoordynacyjne generowanie UUID z lokalnością wstawień liczby auto-increment. Ponieważ mają prefiks czasowy, nowe wiersze dołączają blisko końca indeksu B-tree zamiast rozpraszać się jak UUIDv4, utrzymując szybkie wstawienia i zwarty indeks w miarę rośnięcia tabeli.
Systemy rozproszone bez centralnej sekwencji
Generuj identyfikatory na dowolnym węźle — usłudze, edge workerze lub kliencie — bez współdzielonego licznika i bez koordynacji kolizji, a wciąż sortuj wszystko według czasu utworzenia po fakcie. ULID dają mikrousługom unikalny, uporządkowany klucz bez okrężnej drogi do bazy danych w celu jego przydzielenia.
Logi zdarzeń i identyfikatory komunikatów
Stempluj zdarzenia, wiersze logów lub komunikaty kolejki monotonicznymi ULID, aby pozostawały w ścisłym porządku chronologicznym nawet wtedy, gdy wiele z nich powstaje w tej samej milisekundzie. Skanowanie zakresu okna czasowego staje się prostym porównaniem ciągów.
Bezpieczne dla adresów URL identyfikatory publiczne
ULID to 26 znaków bez myślników i z bezpiecznym dla adresów URL alfabetem, więc trafia do ścieżki, nazwy pliku lub nagłówka bez escapowania i jest krótszy niż 36-znakowy UUID. Zdekoduj osadzony timestamp później, aby zobaczyć, kiedy zasób został utworzony.
Pomost do systemu obsługującego tylko UUID
Pracujesz z kolumną bazy danych lub API, które akceptuje tylko UUID? Generuj sortowalne ULID, konwertuj je na postać UUID do przechowywania lub transportu i konwertuj z powrotem, gdy potrzebujesz zwięzłego sortowalnego ciągu — 128-bitowa wartość jest zachowana dokładnie w obu kierunkach.
Deterministyczne fixtury testowe
Zasilaj testy ULID-ami o wybranych timestampach za pomocą opcji własnego czasu, tak aby fixtury były powtarzalne i już uporządkowane czasowo. Dekoduj je w asercjach, aby zweryfikować czas utworzenia, który zarejestrował Twój kod.

Jak działają ULID

Układ 128-bitowy: 48 bitów czasu + 80 bitów losowości
ULID ma dokładnie 128 bitów. Wyższe 48 bitów to timestamp Unix w milisekundach; niższe 80 bitów jest losowe. Zakodowane w Crockford Base32 po 5 bitów na znak, daje to 10 znaków na czas i 16 na losowość — łącznie 26 znaków. Wiodący znak jest zawsze równy 7 lub mniejszy, ponieważ 48 bitów nie wypełnia górnej 5-bitowej grupy.
Kodowanie Crockford Base32
ULID używają alfabetu Crockford Base32 (0–9 oraz A–Z z wyłączeniem I, L, O i U). Odrzucenie tych czterech liter pozwala uniknąć pomyłki z cyframi 1 i 0 oraz pozwala dekoderom traktować ciąg z pominięciem wielkości liter, odwzorowując na wejściu I i L na 1, a O na 0. Alfabet jest uporządkowany, co sprawia, że zakodowany ciąg sortuje się tak samo jak bazowe bity.
Sortowalność leksykograficzna
Ponieważ timestamp jest najbardziej znaczącym komponentem, a alfabet Base32 zachowuje porządek, porównywanie dwóch ULID jako ciągów daje ten sam wynik co porównywanie ich 128-bitowych wartości, co daje ten sam wynik co porównywanie ich czasów utworzenia. To właśnie pozwala zwykłemu ORDER BY lub sortowaniu tablicy uzyskać porządek chronologiczny bez dodatkowego indeksu.
Monotoniczność w obrębie milisekundy
Opcja monotoniczna specyfikacji ULID utrzymuje stabilny porządek dla identyfikatorów wybitych w tej samej milisekundzie: losowość pierwszego identyfikatora w milisekundzie jest generowana normalnie, a każdy późniejszy identyfikator w tej milisekundzie to poprzednia losowa wartość plus jeden. To narzędzie realizuje to przez zwiększanie 80-bitowej losowości jako liczby całkowitej big-endian.
Bezpieczna losowość przez crypto.getRandomValues
80 losowych bitów jest wypełnianych z crypto.getRandomValues, CSPRNG Web Crypto, a nie z Math.random. Przy 80 bitach entropii wygenerowanie nawet milionów ULID w tej samej milisekundzie utrzymuje znikomo małe prawdopodobieństwo kolizji.
ULID ↔ UUID to czyste ponowne kodowanie
Konwersja między ULID a UUID nie zmienia żadnych bitów — ponownie koduje te same 128 bitów z Crockford Base32 na szesnastkowy zapis z myślnikami lub z powrotem. W rezultacie cykl jest dokładny: ULID skonwertowany na UUID i z powrotem jest identyczny co do bajtu z oryginałem. Zwróć uwagę, że bajty ULID nie ustawiają pól wersji i wariantu UUID, więc wynikowy UUID jest prawidłową 128-bitową wartością, ale nie jest oznaczonym wersją UUIDv4 ani v7.

Dobre praktyki dla ULID

Używaj trybu monotonicznego do wstawień o dużej przepustowości
Jeśli Twój system potrafi tworzyć więcej niż jeden identyfikator na milisekundę, a polegasz na porządku, generuj monotoniczne ULID. Zwykłe ULID są nieuporządkowane w obrębie milisekundy; monotoniczne są ściśle rosnące, więc partia pozostaje posortowana niezależnie od tego, jak szybko je wybijasz.
Przechowuj ULID zwięźle
ULID ma 128 bitów — przechowuj go jako 16 binarnych bajtów lub kolumnę typowaną na UUID, a nie jako 26-znakowe pole tekstowe, gdy liczy się miejsce i rozmiar indeksu. Konwertuj na ciąg Base32 tylko na obrzeżach, gdzie widzą go ludzie lub adresy URL. Zakładka Konwertuj tego narzędzia daje Ci postać UUID do przechowywania.
Pamiętaj, że timestamp jest widoczny
ULID ujawnia czas swojego utworzenia każdemu, kto potrafi go odczytać. To świetne do debugowania i porządkowania, ale jeśli ujawnianie czasu utworzenia jest problemem — powiedzmy, w identyfikatorze publicznym — rozważ ten wyciek lub użyj w pełni losowego UUIDv4 tam, gdzie porządek nie ma znaczenia.
Zawsze generuj za pomocą CSPRNG
Gwarancja unikalności zależy od tego, że 80 losowych bitów jest nieprzewidywalne. Używaj kryptograficznie bezpiecznego źródła, takiego jak crypto.getRandomValues, jak robi to narzędzie — nigdy Math.random, którego przewidywalność mogłaby pozwolić, by identyfikatory się zderzyły lub zostały odgadnięte.
Świadomie wybieraj ULID albo UUIDv7
Oba dają uporządkowane czasowo 128-bitowe identyfikatory. Wybierz ULID dla najkrótszego bezpiecznego dla adresów URL ciągu; wybierz UUIDv7, gdy musisz pozostać w standardowym formacie UUID z bitami wersji i wariantu. Standaryzuj się na jednym w danym systemie i używaj zakładki Konwertuj, gdy musisz przekroczyć granicę.

ULID — najczęściej zadawane pytania

Czym jest ULID?
ULID (Universally Unique Lexicographically Sortable Identifier) to 128-bitowy identyfikator zaprojektowany jako bardziej sortowalna, bardziej zwięzła alternatywa dla UUID. Zapisuje się go jako 26 znaków kodowania Crockford Base32: pierwszych 10 znaków przechowuje 48-bitowy timestamp w milisekundach od epoki Unix, a pozostałych 16 znaków przechowuje 80 bitów losowości. Ponieważ timestamp jest najbardziej znaczącą częścią, a Base32 zachowuje kolejność, ULID utworzone później zawsze sortują się po wcześniejszych przy porównywaniu jako zwykłe ciągi — kolumna ULID jest więc naturalnie uporządkowana czasowo. Alfabet Crockforda celowo wyklucza litery I, L, O oraz U, aby uniknąć pomyłki z cyframi i zachować niewrażliwość ciągu na wielkość liter oraz bezpieczeństwo dla adresów URL. ULID wprowadzono, aby rozwiązać praktyczny problem z losowym UUIDv4: losowe identyfikatory rozpraszają się po indeksie bazy danych, pogarszając wydajność wstawień, podczas gdy ULID z prefiksem czasowym ląduje za każdym razem blisko końca indeksu.
ULID a UUID — którego użyć?
ULID stosuj wtedy, gdy chcesz identyfikatorów jednocześnie unikalnych i naturalnie sortowalnych według czasu utworzenia; klasycznego UUIDv4 użyj, gdy konkretnie potrzebujesz nieprzejrzystego, w pełni losowego identyfikatora bez osadzonego timestampu. Kluczowe różnice: ULID to 26 znaków Base32 wobec 36 znaków UUID z myślnikami, więc ULID są krótsze i bezpieczne dla adresów URL bez escapowania. ULID koduje czas swojego utworzenia, czego UUIDv4 nie robi — co przydaje się do porządkowania i debugowania, ale warto o tym pamiętać, jeśli wolisz nie ujawniać, kiedy rekord powstał. Oba mają 128 bitów i oba nie wymagają koordynacji, więc ryzyko kolizji jest dla każdego znikome. Jeśli Twój stos standaryzuje się na UUID, a wciąż chcesz porządku czasowego, UUIDv7 (z generatora UUID) oferuje podobny projekt z prefiksem czasowym w formacie UUID — albo możesz wygenerować ULID tutaj i skonwertować je na UUID w zakładce Konwertuj.
Czy ULID są sortowalne?
Tak — to ich cecha definiująca. Ponieważ 48-bitowy timestamp w milisekundach zajmuje pierwszych 10 znaków, a Crockford Base32 zachowuje porządek leksykograficzny, sortowanie ULID jako zwykłych ciągów sortuje je według czasu utworzenia. Dotyczy to każdego systemu, który porównuje ciągi bajt po bajcie: ORDER BY w bazie danych, posortowanego zbioru, listy plików czy zwykłego sortowania tablicy. Praktyczną korzyścią jest wydajność bazy danych: klucze uporządkowane czasowo dołączają na koniec indeksu B-tree, zamiast rozpraszać się losowo jak UUIDv4, co utrzymuje szybkie wstawienia i zwarty indeks. W obrębie jednej milisekundy porządek zwykłych ULID jest losowy, więc jeśli potrzebujesz ścisłego porządku nawet dla identyfikatorów powstałych w tej samej milisekundzie, użyj trybu monotonicznego, który zwiększa losowość tak, by każda wartość była gwarantowanie większa od poprzedniej.
Jak zdekodować timestamp ULID?
Wklej ULID do zakładki Dekoduj, a narzędzie natychmiast wyodrębni osadzony czas utworzenia, w całości w Twojej przeglądarce. Odczytuje pierwszych 10 znaków, konwertuje je z Crockford Base32 z powrotem na 48-bitową liczbę milisekund od epoki Unix i pokazuje tę chwilę w UTC i w Twoim czasie lokalnym wraz z surową wartością w milisekundach Uniksa. Na przykład kanoniczny ULID 01ARYZ6S41TSV4RRFFQ69G5FAV dekoduje się do 1469918176385 ms, czyli 2016-07-30T22:36:16.385Z. Pozostałych 16 znaków to 80-bitowa losowość i nie niesie żadnego znaczenia do zdekodowania. Odczyt timestampu w ten sposób przydaje się do debugowania, audytu czasu utworzenia rekordu lub sprawdzenia, czy identyfikator naprawdę jest ULID — bez żadnego zapytania do bazy danych.
Czym jest monotoniczny ULID?
Monotoniczny ULID gwarantuje ścisły porządek nawet dla identyfikatorów wygenerowanych w tej samej milisekundzie. Zwykłe ULID utworzone w jednej milisekundzie mają ten sam 10-znakowy prefiks czasowy, ale ich 80-bitowe losowe końcówki są niezależne, więc ich wzajemny porządek nie jest zdefiniowany. Generowanie monotoniczne to rozwiązuje: pierwszy ULID w danej milisekundzie dostaje świeżą losowość, a każdy kolejny ULID w tej samej milisekundzie powstaje przez zwiększenie poprzedniej losowości o jeden. Wynikiem jest sekwencja, w której każda wartość jest ściśle większa od poprzedniej, więc partia wstawiana w ciasnej pętli pozostaje idealnie posortowana. Ma to znaczenie w systemach o dużej przepustowości — logach zdarzeń, kolejkach komunikatów, importach masowych — gdzie wiele wierszy może powstawać szybciej, niż tyka zegar milisekundowy, a wciąż potrzebujesz stabilnego, rosnącego klucza.
Czy ten generator ULID jest bezpieczny i prywatny?
Tak, pod oboma względami. Losowość w każdym ULID pochodzi z crypto.getRandomValues, kryptograficznie bezpiecznego generatora liczb losowych przeglądarki — nigdy Math.random — więc 80 losowych bitów jest nieprzewidywalne, a szansa kolizji dwóch ULID w tej samej milisekundzie jest znikomo mała. Co równie ważne, wszystko działa lokalnie: ULID są generowane, dekodowane i konwertowane w całości na Twoim urządzeniu. Nic nie jest przesyłane, logowane ani przechowywane, a możesz to potwierdzić, otwierając narzędzia deweloperskie i obserwując, jak karta Sieć pozostaje cicha, gdy klikasz Generuj. Ta właściwość prywatności jest całym powodem, by tworzyć identyfikatory w przeglądarce, a nie na serwerze, który z zasady mógłby przechowywać kopię każdej wydanej wartości.
Jaka jest różnica między ULID a UUIDv7?
Zarówno ULID, jak i UUIDv7 to uporządkowane czasowo 128-bitowe identyfikatory, które umieszczają timestamp w milisekundach na początku, więc oba sortują się według czasu utworzenia i oba indeksują się wydajnie — podstawowa idea jest ta sama. Różnica tkwi w formacie i kodowaniu. ULID prezentowany jest jako 26 znaków Crockford Base32 bez myślników, co jest krótsze i bezpieczne dla adresów URL; UUIDv7 prezentowany jest w standardowym 36-znakowym układzie szesnastkowym UUID z myślnikami i niesie bity wersji oraz wariantu na ustalonych pozycjach, więc jest w pełni prawidłowym UUID zgodnym z RFC 9562, który akceptuje każda biblioteka UUID. Wybierz UUIDv7, gdy musisz pozostać w ekosystemie UUID (kolumna UUID w bazie danych, API typowane na UUID); wybierz ULID, gdy chcesz najkrótszego sortowalnego ciągu. Ponieważ oba mają 128 bitów, możesz wygenerować ULID tutaj i skonwertować go na postać UUID w zakładce Konwertuj albo wygenerować UUIDv7 za pomocą generatora UUID.

Powiązane narzędzia

Zobacz wszystkie narzędzia →