Skip to content

ULID-Generator — ULIDs erzeugen & dekodieren

ULIDs online erzeugen, dekodieren und umwandeln — kostenlos, 100 % im Browser. Eingebetteten Zeitstempel auslesen, ULID ↔ UUID umwandeln, im Stapel erzeugen, mit monotonem Modus. Nichts wird je an einen Server gesendet.

Kein Tracking Läuft im Browser Kostenlos
Jede ULID wird lokal mit dem kryptografischen RNG deines Browsers (crypto.getRandomValues) erzeugt. Nichts wird hochgeladen, geloggt oder gespeichert.

Jede ULID nutzt frische 80-Bit-Zufälligkeit.

Was ist eine ULID?

Eine ULID — Universally Unique Lexicographically Sortable Identifier — ist ein 128-Bit-Bezeichner, der entworfen wurde, um eine praktische Schwäche der zufälligen UUIDv4 zu beheben und zugleich ihre beste Eigenschaft zu bewahren: Du kannst überall eine erzeugen, ohne zentralen Koordinator, und dir sicher sein, dass sie eindeutig ist. Der Unterschied ist, dass eine ULID nach Zeit sortierbar ist. Sie wird als 26 Zeichen in Crockford-Base32 dargestellt, aufgeteilt in zwei Teile: Die ersten 10 Zeichen sind ein 48-Bit-Zeitstempel, der Millisekunden seit der Unix-Epoche zählt, und die letzten 16 Zeichen sind 80 Bit kryptografisch sichere Zufälligkeit. Stell die Zeit voran, codiere sie in einem reihenfolgeerhaltenden Alphabet, und der Bezeichner sortiert als reine Zeichenkette chronologisch.

Diese eine Entwurfsentscheidung hat überproportionale Folgen für Datenbanken. Ein zufälliger UUIDv4-Primärschlüssel landet bei jeder Einfügung an einer unvorhersehbaren Stelle in einem B-Baum-Index, was den Index fragmentiert, den Cache durcheinanderwirbelt und die Schreibleistung mit wachsender Tabelle langsam verschlechtert. Eine ULID landet, weil sie zeitpräfixiert ist, jedes Mal an oder nahe dem Ende des Index — Einfügungen bleiben sequenziell, der Index bleibt kompakt, und Bereichsabfragen über ein Zeitfenster werden günstig. Du erhältst die koordinationsfreie Erzeugung einer UUID und die Einfüge-Lokalität einer automatisch hochzählenden Ganzzahl, ohne einen erratbaren sequenziellen Zähler offenzulegen.

Die Codierungsdetails sind bewusst gewählt. Crockford-Base32 lässt die Buchstaben I, L, O und U weg, sowohl um visuelle Verwechslungen mit den Ziffern 1 und 0 zu vermeiden als auch um die Zeichenkette bei der Eingabe unabhängig von Groß-/Kleinschreibung zu machen. Das Ergebnis sind 26 Zeichen ohne Bindestriche, die sich ohne Escaping in eine URL, einen Dateinamen oder einen Request-Header einfügen lassen — merklich kürzer als die 36-Zeichen-Form einer UUID mit Bindestrichen. Der 48-Bit-Zeitstempel läuft lange nicht aus: Er kann Daten bis zum Jahr 10889 darstellen, bevor der Millisekundenzähler überläuft.

ULIDs sind nicht für alles das richtige Werkzeug. Der eingebettete Zeitstempel verrät, wann ein Datensatz erstellt wurde, was ein Vorteil fürs Debugging und für die Ordnung ist, aber ein kleines Informationsleck, falls du das lieber nicht offenlegen möchtest. Und wenn dein Stack auf den UUID-Typ festgelegt ist, bevorzugst du vielleicht UUIDv7, das dieselbe zeitpräfixierte Idee innerhalb des standardmäßigen UUID-Formats anwendet. Aber wenn du kurze, URL-sichere, sortierbare Bezeichner willst, die du auf jedem Knoten prägen und aus denen du einen Zeitstempel wieder auslesen kannst, ist eine ULID ein ausgezeichneter Standard — und weil sie nur 128 Bit ist, kannst du sie über den Tab „Umwandeln“ dieses Tools jederzeit in eine UUID und zurück umwandeln.

// 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

Hauptfunktionen

Erzeugen, Dekodieren und Umwandeln auf einer Seite

Drei Tabs decken den gesamten ULID-Arbeitsablauf ab: neue ULIDs prägen, eine bestehende dekodieren, um ihren Zeitstempel auszulesen, und verlustfrei zwischen ULID und UUID umwandeln. Die meisten konkurrierenden Tools können nur das Erste; hier liegt der vollständige Hin-und-zurück-Weg auf einer einzigen Seite.

Zeitstempel-Dekodierer

Füge eine beliebige ULID ein und lies die exakte Millisekunde aus, in der sie erstellt wurde — angezeigt in UTC, in deiner lokalen Zeit und als rohe Unix-Millisekunden — sowie das 80-Bit-Zufallssegment. Prüfe, wann ein Bezeichner geprägt wurde, ohne Datenbankabfrage.

Verlustfreie ULID-↔-UUID-Umwandlung

Eine ULID und eine UUID sind beide 128 Bit, sodass die Umwandlung exakt und umkehrbar ist. Der Tab „Umwandeln“ erkennt automatisch, welches Format du eingefügt hast, und erzeugt das andere, sodass du eine sortierbare ULID und eine UUID-typisierte Spalte oder API überbrückst, ohne ein einziges Bit zu verlieren.

Monotoner Modus

Brauchst du strikte Ordnung selbst für IDs, die in derselben Millisekunde erstellt werden? Der monotone Modus erhöht die Zufälligkeit, sodass jede ULID garantiert größer als die letzte ist und eine enge Einfügeschleife perfekt sortiert bleibt.

Stapelerzeugung

Erzeuge bis zu 50 ULIDs auf einmal und kopiere den ganzen Satz mit „Alle kopieren“. Ideal zum Befüllen von Test-Fixtures, für Masseneinfügungen oder zum Füllen einer Lookup-Tabelle, ohne fünfzigmal zu klicken.

Eigener Zeitstempel

Bette statt jetzt einen bestimmten Moment ein — nützlich für deterministische Testdaten oder zum Rückdatieren von Datensätzen während einer Migration, während die sortierbare Eigenschaft erhalten bleibt.

Kryptografisch sichere Zufälligkeit

Die 80 Zufallsbits stammen aus crypto.getRandomValues, dem CSPRNG des Browsers — niemals Math.random —, sodass jede ULID unvorhersehbar ist und Kollisionen in derselben Millisekunde verschwindend unwahrscheinlich sind.

100 % privat, nur im Browser

Jede ULID wird vollständig auf deinem Gerät erzeugt, dekodiert und umgewandelt. Keine Netzwerkanfragen, kein Logging, keine Speicherung — prüfe es selbst in den DevTools → Netzwerk. Bezeichner gelangen nie zu Dritten.

ULID-Beispiele

Eine einzelne ULID erzeugen

Modus: Standard · Anzahl: 1
01KVT0F720ZK9N4T2QX7VR8WMC

Eine ULID besteht aus 26 Zeichen in Crockford-Base32. Die ersten 10 Zeichen codieren einen 48-Bit-Millisekunden-Zeitstempel, die letzten 16 codieren 80 Bit kryptografisch sichere Zufälligkeit aus crypto.getRandomValues. Weil der Zeitstempel zuerst kommt und Base32 die Byte-Reihenfolge bewahrt, sortieren später erzeugte ULIDs als reine Zeichenketten immer nach früheren — ganz ohne separaten Index. Klicke auf Kopieren, um den Wert zu greifen; klicke erneut auf Erzeugen für eine frische ULID.

Eine ULID dekodieren, um ihren Zeitstempel auszulesen

01ARYZ6S41TSV4RRFFQ69G5FAV
Zeitstempel (UTC): 2016-07-30T22:36:16.385Z · Zufälligkeit: TSV4RRFFQ69G5FAV

Das Dekodieren wandelt die ersten 10 Zeichen zurück in den 48-Bit-Millisekundenwert, der bei der Erzeugung eingebettet wurde — hier 1469918176385 ms, also 2016-07-30T22:36:16.385Z. Das ist das kanonische Beispiel aus der ULID-Spezifikation. Der Tab „Dekodieren“ zeigt den Zeitstempel in UTC und deiner lokalen Zeit, die rohen Unix-Millisekunden und das 80-Bit-Zufallssegment, sodass du genau prüfen kannst, wann ein Bezeichner geprägt wurde — ohne Datenbankabfrage.

Eine ULID in eine UUID umwandeln

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

Eine ULID und eine UUID sind beide exakt 128 Bit, daher ist die Umwandlung verlustfrei und vollständig umkehrbar — dieselben Bits werden lediglich von Crockford-Base32 in Hexadezimal mit Bindestrichen umcodiert. Der Tab „Umwandeln“ erkennt automatisch, ob du eine ULID oder eine UUID eingefügt hast, und wandelt in die jeweils andere Form um. So kannst du ULIDs in einer UUID-Spalte speichern oder eine ULID an ein System übergeben, das nur UUID versteht, und später wieder zurückwandeln, wenn du die sortierbare Zeichenkette brauchst.

Monotone ULIDs im Stapel erzeugen

Modus: Monoton · Anzahl: 3 (dieselbe Millisekunde)
01KVT0F720ZK9N4T2QX7VR8WMC
01KVT0F720ZK9N4T2QX7VR8WMD
01KVT0F720ZK9N4T2QX7VR8WME

Wenn viele IDs innerhalb derselben Millisekunde entstehen, teilen sich gewöhnliche ULIDs zwar das 10-Zeichen-Zeitpräfix, doch ihre Zufallsenden sind ungeordnet. Der monotone Modus behebt das: Innerhalb einer Millisekunde erhöht er die vorherige Zufälligkeit um eins, sodass jede ULID strikt größer als die letzte ist und ein Stapel perfekt sortiert bleibt. Beachte, dass sich die drei Werte nur im letzten Zeichen unterscheiden (C, D, E) — ideal für Einfügungen mit hohem Durchsatz, bei denen die Ordnung selbst unterhalb der Millisekunde halten muss.

Eine ULID für ein bestimmtes Datum erzeugen

Eigene Zeit: 2026-06-23 10:30:00 UTC
01KVT0F720… (Zeitkomponente 01KVT0F720)

Lege einen eigenen Zeitstempel fest, und der Generator bettet genau diesen Moment statt jetzt ein, während er die Zufälligkeit weiterhin aus einem sicheren RNG bezieht. Die 10-Zeichen-Zeitkomponente für 2026-06-23T10:30:00.000Z lautet 01KVT0F720. Das ist nützlich, um Test-Fixtures mit deterministischen, zeitlich geordneten Bezeichnern zu befüllen oder um Datensätze in einer Migration rückzudatieren, während die sortierbare Eigenschaft erhalten bleibt.

So nutzt du den ULID-Generator

  1. 1

    Einen Erzeugungsmodus wählen

    Der Standardmodus gibt jeder ULID frische 80-Bit-Zufälligkeit. Der monotone Modus garantiert, dass ULIDs, die innerhalb derselben Millisekunde erzeugt werden, strikt aufsteigend sind — wähle ihn für Einfügungen mit hohem Durchsatz, bei denen die Ordnung selbst unterhalb der Millisekunde halten muss.

  2. 2

    Anzahl, Schreibweise und (optional) eine eigene Zeit festlegen

    Erzeuge 1 bis 50 ULIDs auf einmal. Die Ausgabe erfolgt standardmäßig in GROSSBUCHSTABEN — der kanonischen ULID-Form — oder du wechselst zu Kleinbuchstaben. Lass die Zeit leer, um jetzt zu stempeln, oder setze einen eigenen Zeitstempel, um für Fixtures oder rückdatierte Datensätze einen bestimmten Moment einzubetten.

  3. 3

    Erzeugen und kopieren

    Klicke auf „ULID erzeugen“. Nutze „Kopieren“ bei einem einzelnen Wert oder „Alle kopieren“, um den gesamten Stapel als zeilengetrennten Text zu greifen, fertig zum Einfügen in Code, eine Seed-Datei oder eine Tabelle.

  4. 4

    Eine ULID dekodieren, um ihren Zeitstempel auszulesen

    Füge im Tab „Dekodieren“ eine beliebige ULID ein, um den 48-Bit-Erstellungszeitstempel in UTC und lokaler Zeit, die rohen Unix-Millisekunden und die 80-Bit-Zufälligkeit zu extrahieren — vollständig in deinem Browser, ohne jede Abfrage.

  5. 5

    Zwischen ULID und UUID umwandeln

    Füge im Tab „ULID ↔ UUID“ eine ULID oder eine UUID ein; das Tool erkennt die Eingabe automatisch und wandelt verlustfrei in das andere Format um. Speichere ULIDs in UUID-Spalten oder übergib eine ULID an ein UUID-only-System und wandle zurück, wenn du die sortierbare Zeichenkette brauchst.

Common Errors

ULIDs derselben Millisekunde als geordnet behandeln

Gewöhnliche ULIDs, die innerhalb einer Millisekunde erstellt werden, teilen sich das Zeitpräfix, haben aber ungeordnete Zufallsenden, sodass ihre relative Reihenfolge undefiniert ist. Wenn du bei dieser Rate auf strikte Ordnung angewiesen bist, nutze stattdessen den monotonen Modus.

✗ Falsch
Standardmodus, 3 IDs in einer ms  →  Reihenfolge innerhalb der ms ist zufällig
✓ Richtig
Monotoner Modus, 3 IDs in einer ms  →  …WMC < …WMD < …WME

Erwarten, dass eine umgewandelte ULID eine gültige UUIDv4 ist

Das Umwandeln einer ULID in UUID-Form codiert dieselben 128 Bit um; es setzt nicht die Versions- und Variantenfelder der UUID. Das Ergebnis ist eine gültige 128-Bit-UUID-Zeichenkette, meldet sich aber nicht als Version 4 oder 7, wenn eine Bibliothek diese Bits prüft.

✗ Falsch
uuid.version(ulidToUuid(id))  →  nicht 4 (die Bits gehören der ULID)
✓ Richtig
Behandle sie als undurchsichtigen 128-Bit-Wert oder erzeuge stattdessen eine echte UUIDv7

Kleinbuchstaben i, l, o von Hand in einer ULID verwenden

Crockford-Base32 lässt I, L, O und U weg. Dekodierer bilden I und L auf 1 und O auf 0 ab, aber das Eintippen dieser Buchstaben von Hand in eine ULID ist fehleranfällig. Kopiere ULIDs, statt sie abzutippen.

✗ Falsch
01ARYZ6S41TSV4RRFFQ69G5FAO  →  mehrdeutiges O
✓ Richtig
01ARYZ6S41TSV4RRFFQ69G5FAV  →  nur kanonische Zeichen

Wofür ULIDs verwendet werden

Datenbank-Primärschlüssel, die sortiert bleiben
Verwende ULIDs als Primärschlüssel, um die koordinationsfreie Erzeugung einer UUID mit der Einfüge-Lokalität einer Auto-Increment-Ganzzahl zu vereinen. Weil sie zeitpräfixiert sind, werden neue Zeilen nahe dem Ende eines B-Baum-Index angehängt, statt wie UUIDv4 zu streuen, was Einfügungen schnell und den Index kompakt hält, während die Tabelle wächst.
Verteilte Systeme ohne zentrale Sequenz
Erzeuge Bezeichner auf jedem Knoten — Dienst, Edge-Worker oder Client — ohne gemeinsamen Zähler und ohne Kollisionskoordination, und sortiere dennoch alles im Nachhinein nach Erstellungszeit. ULIDs geben Microservices einen eindeutigen, geordneten Schlüssel ohne Datenbank-Roundtrip zur Vergabe.
Ereignisprotokolle und Nachrichten-IDs
Stemple Ereignisse, Logzeilen oder Warteschlangennachrichten mit monotonen ULIDs, sodass sie in strikt chronologischer Reihenfolge bleiben, selbst wenn viele innerhalb derselben Millisekunde erzeugt werden. Das Bereichsabfragen eines Zeitfensters wird zu einem einfachen Zeichenkettenvergleich.
URL-sichere öffentliche Bezeichner
Eine ULID besteht aus 26 Zeichen ohne Bindestriche und mit einem URL-sicheren Alphabet, sodass sie sich ohne Escaping in einen Pfad, einen Dateinamen oder einen Header einfügen lässt und kürzer ist als eine 36-Zeichen-UUID. Dekodiere später den eingebetteten Zeitstempel, um zu sehen, wann die Ressource erstellt wurde.
Brücke zu einem UUID-only-System
Arbeitest du mit einer Datenbankspalte oder einer API, die nur UUIDs akzeptiert? Erzeuge sortierbare ULIDs, wandle sie zur Speicherung oder Übertragung in UUID-Form um und wandle zurück, wenn du die kompakte sortierbare Zeichenkette brauchst — der 128-Bit-Wert bleibt in beide Richtungen exakt erhalten.
Deterministische Test-Fixtures
Befülle Tests über die Option „eigene Zeit“ mit ULIDs zu gewählten Zeitstempeln, sodass Fixtures reproduzierbar und bereits zeitlich geordnet sind. Dekodiere sie in Assertions, um die von deinem Code aufgezeichnete Erstellungszeit zu prüfen.

So funktionieren ULIDs

128-Bit-Layout: 48 Bit Zeit + 80 Bit Zufälligkeit
Eine ULID ist exakt 128 Bit. Die oberen 48 Bit sind ein Millisekunden-Unix-Zeitstempel; die unteren 80 Bit sind zufällig. Codiert in Crockford-Base32 mit 5 Bit pro Zeichen ergibt das 10 Zeichen für die Zeit und 16 für die Zufälligkeit — insgesamt 26 Zeichen. Das führende Zeichen ist immer 7 oder niedriger, weil 48 Bit die oberste 5-Bit-Gruppe nicht füllen.
Crockford-Base32-Codierung
ULIDs verwenden das Crockford-Base32-Alphabet (0–9 und A–Z ohne I, L, O und U). Das Weglassen dieser vier Buchstaben vermeidet Verwechslungen mit den Ziffern 1 und 0 und erlaubt Dekodierern, die Zeichenkette unabhängig von Groß-/Kleinschreibung zu behandeln, indem sie bei der Eingabe I und L auf 1 und O auf 0 abbilden. Das Alphabet ist geordnet, und genau das lässt die codierte Zeichenkette gleich sortieren wie die zugrunde liegenden Bits.
Lexikografische Sortierbarkeit
Weil der Zeitstempel die höchstwertige Komponente ist und das Base32-Alphabet die Reihenfolge bewahrt, liefert der Vergleich zweier ULIDs als Zeichenketten dasselbe Ergebnis wie der Vergleich ihrer 128-Bit-Werte, was wiederum dasselbe Ergebnis liefert wie der Vergleich ihrer Erstellungszeiten. Genau das lässt ein schlichtes ORDER BY oder eine Array-Sortierung chronologische Ordnung ohne zusätzlichen Index erzeugen.
Monotonie innerhalb einer Millisekunde
Die monotone Option der ULID-Spezifikation hält die Ordnung für IDs stabil, die in derselben Millisekunde geprägt werden: Die Zufälligkeit der ersten ID in einer Millisekunde wird normal erzeugt, und jede spätere ID in dieser Millisekunde ist der vorherige Zufallswert plus eins. Dieses Tool setzt das um, indem es die 80-Bit-Zufälligkeit als Big-Endian-Ganzzahl erhöht.
Sichere Zufälligkeit über crypto.getRandomValues
Die 80 Zufallsbits werden aus crypto.getRandomValues gefüllt, dem CSPRNG von Web Crypto, nicht aus Math.random. Mit 80 Bit Entropie hält selbst das Erzeugen von Millionen ULIDs in derselben Millisekunde die Kollisionswahrscheinlichkeit vernachlässigbar klein.
ULID ↔ UUID ist eine reine Umcodierung
Die Umwandlung zwischen ULID und UUID ändert keine Bits — sie codiert dieselben 128 Bit von Crockford-Base32 in Hexadezimal mit Bindestrichen um oder zurück. Folglich ist der Hin-und-zurück-Weg exakt: Eine ULID, die in eine UUID und zurück umgewandelt wird, ist byte-identisch zum Original. Beachte, dass die Bytes einer ULID die Versions- und Variantenfelder der UUID nicht setzen, sodass die resultierende UUID ein gültiger 128-Bit-Wert, aber keine versionsmarkierte UUIDv4 oder v7 ist.

Best Practices für ULIDs

Monotonen Modus für Einfügungen mit hohem Durchsatz nutzen
Wenn dein System mehr als einen Bezeichner pro Millisekunde erzeugen kann und du dich auf die Ordnung verlässt, erzeuge monotone ULIDs. Gewöhnliche ULIDs sind innerhalb einer Millisekunde ungeordnet; monotone sind strikt aufsteigend, sodass ein Stapel sortiert bleibt, egal wie schnell du sie prägst.
ULIDs kompakt speichern
Eine ULID ist 128 Bit — speichere sie als 16 binäre Bytes oder eine UUID-typisierte Spalte statt als 26-Zeichen-Textfeld, wenn Platz und Indexgröße zählen. Wandle nur an den Rändern, wo Menschen oder URLs sie sehen, in die Base32-Zeichenkette um. Der Tab „Umwandeln“ dieses Tools liefert dir die UUID-Form zur Speicherung.
Daran denken, dass der Zeitstempel sichtbar ist
Eine ULID verrät ihre Erstellungszeit jedem, der sie lesen kann. Das ist großartig fürs Debugging und für die Ordnung, aber wenn das Offenlegen der Erstellungszeit ein Problem ist — etwa in einem öffentlich sichtbaren Bezeichner —, wäge dieses Leck ab oder verwende eine vollständig zufällige UUIDv4, wo die Ordnung keine Rolle spielt.
Immer mit einem CSPRNG erzeugen
Die Eindeutigkeitsgarantie hängt davon ab, dass die 80 Zufallsbits unvorhersehbar sind. Verwende eine kryptografisch sichere Quelle wie crypto.getRandomValues, wie dieses Tool es tut — niemals Math.random, dessen Vorhersehbarkeit dazu führen könnte, dass Bezeichner kollidieren oder erraten werden.
ULID oder UUIDv7 bewusst wählen
Beide liefern zeitlich geordnete 128-Bit-IDs. Wähle ULID für die kürzeste URL-sichere Zeichenkette; wähle UUIDv7, wenn du im standardmäßigen UUID-Format mit Versions- und Variantenbits bleiben musst. Standardisiere pro System auf eines und nutze den Tab „Umwandeln“, wenn du die Grenze überschreiten musst.

ULID — häufig gestellte Fragen

Was ist eine ULID?
Eine ULID (Universally Unique Lexicographically Sortable Identifier) ist ein 128-Bit-Bezeichner, der als besser sortierbare, kompaktere Alternative zur UUID entworfen wurde. Sie wird als 26 Zeichen in Crockford-Base32 geschrieben: Die ersten 10 Zeichen halten einen 48-Bit-Zeitstempel in Millisekunden seit der Unix-Epoche, die übrigen 16 Zeichen halten 80 Bit Zufälligkeit. Weil der Zeitstempel der höchstwertige Teil ist und Base32 die Reihenfolge bewahrt, sortieren später erzeugte ULIDs als reine Zeichenketten immer nach früheren — eine Spalte voller ULIDs ist also von Natur aus zeitlich geordnet. Das Crockford-Alphabet lässt die Buchstaben I, L, O und U bewusst weg, um Verwechslungen mit Ziffern zu vermeiden und die Zeichenkette unabhängig von Groß-/Kleinschreibung und URL-sicher zu halten. ULIDs wurden eingeführt, um ein praktisches Problem mit zufälligen UUIDv4 zu lösen: Zufällige Bezeichner streuen über einen Datenbankindex und beeinträchtigen die Einfügeleistung, während eine zeitpräfixierte ULID jedes Mal nahe dem Ende des Index landet.
ULID vs. UUID — was sollte ich verwenden?
Verwende eine ULID, wenn du Bezeichner willst, die zugleich eindeutig und von Natur aus nach Erstellungszeit sortierbar sind; verwende eine klassische UUIDv4, wenn du ausdrücklich einen undurchsichtigen, vollständig zufälligen Bezeichner ohne eingebetteten Zeitstempel brauchst. Die wichtigsten Unterschiede: Eine ULID besteht aus 26 Base32-Zeichen gegenüber den 36 Zeichen einer UUID mit Bindestrichen — ULIDs sind also kürzer und URL-sicher ohne Escaping. Eine ULID codiert ihre Erstellungszeit, was eine UUIDv4 nicht tut — nützlich für Ordnung und Debugging, aber erwähnenswert, falls du lieber nicht offenlegen möchtest, wann ein Datensatz erstellt wurde. Beide sind 128 Bit und beide kommen ohne Koordination aus, sodass das Kollisionsrisiko in beiden Fällen vernachlässigbar ist. Wenn dein Stack auf UUIDs standardisiert ist, du aber dennoch zeitliche Ordnung willst, bietet UUIDv7 (aus dem UUID-Generator) ein ähnliches zeitpräfixiertes Design im UUID-Format — oder du erzeugst hier ULIDs und wandelst sie über den Tab „Umwandeln“ in UUIDs um.
Sind ULIDs sortierbar?
Ja — das ist ihre kennzeichnende Eigenschaft. Weil der 48-Bit-Millisekunden-Zeitstempel die ersten 10 Zeichen belegt und Crockford-Base32 die lexikografische Reihenfolge bewahrt, sortiert das Sortieren von ULIDs als gewöhnliche Zeichenketten sie nach Erstellungszeit. Das gilt in jedem System, das Zeichenketten Byte für Byte vergleicht: ein ORDER BY in der Datenbank, ein sortiertes Set, eine Dateiliste oder eine einfache Array-Sortierung. Der praktische Gewinn ist die Datenbankleistung: Zeitlich geordnete Schlüssel werden am Ende eines B-Baum-Index angehängt, statt wie UUIDv4 zufällig zu streuen, was Einfügungen schnell und den Index kompakt hält. Innerhalb einer einzelnen Millisekunde ist die Ordnung gewöhnlicher ULIDs zufällig; wenn du also strikte Ordnung auch für IDs brauchst, die in derselben Millisekunde geprägt werden, nutze den monotonen Modus, der die Zufälligkeit erhöht, sodass jeder Wert garantiert größer als der letzte ist.
Wie dekodiere ich den Zeitstempel einer ULID?
Füge die ULID in den Tab „Dekodieren“ ein, und das Tool extrahiert die eingebettete Erstellungszeit sofort, vollständig in deinem Browser. Es liest die ersten 10 Zeichen, wandelt sie von Crockford-Base32 zurück in eine 48-Bit-Ganzzahl an Millisekunden seit der Unix-Epoche und zeigt diesen Moment in UTC und deiner lokalen Zeit zusammen mit dem rohen Unix-Millisekundenwert an. Beispielsweise dekodiert die kanonische ULID 01ARYZ6S41TSV4RRFFQ69G5FAV zu 1469918176385 ms, also 2016-07-30T22:36:16.385Z. Die übrigen 16 Zeichen sind die 80-Bit-Zufälligkeit und tragen keine dekodierbare Bedeutung. Den Zeitstempel auf diese Weise auszulesen ist praktisch zum Debuggen, zum Prüfen, wann ein Datensatz erstellt wurde, oder zur Plausibilitätskontrolle, dass ein Bezeichner wirklich eine ULID ist — ohne Datenbankabfrage.
Was ist eine monotone ULID?
Eine monotone ULID garantiert strikte Ordnung selbst für Bezeichner, die innerhalb derselben Millisekunde erzeugt werden. Gewöhnliche ULIDs, die in einer Millisekunde entstehen, teilen sich dasselbe 10-Zeichen-Zeitpräfix, aber ihre 80-Bit-Zufallsenden sind unabhängig, sodass ihre relative Reihenfolge nicht definiert ist. Die monotone Erzeugung löst das: Die erste ULID in einer gegebenen Millisekunde erhält frische Zufälligkeit, und jede weitere ULID in derselben Millisekunde entsteht, indem die vorherige Zufälligkeit um eins erhöht wird. Das Ergebnis ist eine Folge, in der jeder Wert strikt größer als der davor ist, sodass ein in einer engen Schleife eingefügter Stapel perfekt sortiert bleibt. Das ist wichtig für Systeme mit hohem Durchsatz — Ereignisprotokolle, Nachrichtenwarteschlangen, Massenimporte —, bei denen viele Zeilen schneller erstellt werden können, als die Millisekundenuhr tickt, du aber dennoch einen stabilen, aufsteigenden Schlüssel brauchst.
Ist dieser ULID-Generator sicher und privat?
Ja, auf beiden Ebenen. Die Zufälligkeit in jeder ULID stammt aus crypto.getRandomValues, dem kryptografisch sicheren Zufallszahlengenerator des Browsers — niemals Math.random —, sodass die 80 Zufallsbits unvorhersehbar sind und die Chance, dass zwei ULIDs innerhalb derselben Millisekunde kollidieren, verschwindend gering ist. Ebenso wichtig: Alles läuft lokal. Die ULIDs werden vollständig auf deinem Gerät erzeugt, dekodiert und umgewandelt. Nichts wird hochgeladen, geloggt oder gespeichert, und du kannst es bestätigen, indem du die DevTools öffnest und beobachtest, wie der Netzwerk-Tab stumm bleibt, während du auf Erzeugen klickst. Diese Privatsphäre-Eigenschaft ist der ganze Grund, Bezeichner im Browser zu erzeugen statt auf einem Server, der im Prinzip eine Kopie jedes ausgegebenen Werts behalten könnte.
Was ist der Unterschied zwischen ULID und UUIDv7?
Sowohl ULID als auch UUIDv7 sind zeitlich geordnete 128-Bit-Bezeichner, die einen Millisekunden-Zeitstempel voranstellen, sodass beide nach Erstellungszeit sortieren und beide effizient indizieren — die Kernidee ist dieselbe. Der Unterschied liegt in Format und Codierung. Eine ULID wird als 26 Zeichen in Crockford-Base32 ohne Bindestriche dargestellt, was kürzer und URL-sicher ist; UUIDv7 wird im standardmäßigen 36-Zeichen-Hexadezimallayout mit Bindestrichen dargestellt und trägt Versions- und Variantenbits an festen Positionen, sodass es eine vollständig gültige RFC-9562-UUID ist, die jede UUID-Bibliothek akzeptiert. Wähle UUIDv7, wenn du im UUID-Ökosystem bleiben musst (eine UUID-Datenbankspalte, eine UUID-typisierte API); wähle ULID, wenn du die kürzeste sortierbare Zeichenkette willst. Da beide 128 Bit sind, kannst du hier eine ULID erzeugen und sie über den Tab „Umwandeln“ in UUID-Form bringen, oder eine UUIDv7 mit dem UUID-Generator erzeugen.

Verwandte Werkzeuge

Alle Werkzeuge anzeigen →