ULID-Generator

Erzeugen Sie in großer Zahl ULIDs — chronologisch sortierbare Kennungen, die sich als Alternative zu UUIDs eignen.

Tipps zur Nutzung

  • Die ersten 10 Zeichen einer ULID kodieren einen Zeitstempel (den Erzeugungszeitpunkt), die restlichen 16 Zeichen sind zufällig. Außer wenn zwei ULIDs innerhalb derselben Millisekunde erzeugt werden, genügt eine einfache Sortierung als Zeichenkette, um die Erzeugungsreihenfolge wiederherzustellen.
  • Wird als Primärschlüssel einer Datenbank ein vollständig zufälliger UUID v4 verwendet, führt dies dazu, dass neue Zeilen an zufälligen Positionen im Index eingefügt werden, was leicht zur Fragmentierung von B-Tree-Indizes führt. Da ULIDs annähernd zeitlich sortiert sind, werden neue Zeilen meist nahe dem Ende des Index eingefügt, was dieses Problem abmildert.
  • Eine ULID wird als 26 Zeichen in Crockfords Base32 dargestellt (das 32-Zeichen-Alphabet `0`-`9` und `A`-`Z`, aus dem die leicht zu verwechselnden Buchstaben I, L, O und U entfernt wurden). Damit ist sie kürzer als eine UUID (36 Zeichen inklusive Bindestriche) und lässt sich auch in Umgebungen ohne Unterscheidung von Groß- und Kleinschreibung sicher verwenden.
  • Einen Formatvergleich mit Nano ID und UUID v4 finden Sie in der Vergleichstabelle auf unserem Schwestertool, der Nano-ID-Generator-Seite.

Häufig gestellte Fragen

Eine ULID (Universally Unique Lexicographically Sortable Identifier) ist eine Spezifikation für Kennungen, die ähnlich wie eine UUID global eindeutig sind, zusätzlich aber Informationen über den Erzeugungszeitpunkt enthalten — sodass ein einfaches Sortieren als Zeichenkette sie in chronologischer Reihenfolge anordnet.

Der wichtigste Unterschied ist, ob sich die Kennung nach dem Erzeugungszeitpunkt sortieren lässt. Eine UUID v4 ist ein vollständig zufälliger 128-Bit-Wert und lässt sich daher nicht nach Erzeugungsreihenfolge sortieren, während die ersten 48 Bit einer ULID einen Zeitstempel in Millisekunden darstellen, sodass ein einfacher Zeichenkettenvergleich die Erzeugungsreihenfolge offenbart. Auch bei der Darstellung gibt es Unterschiede: Eine ULID besteht aus 26 Base32-Zeichen, eine UUID aus 36 hexadezimalen Zeichen inklusive Bindestriche.

Wird ein vollständig zufälliger Wert wie UUID v4 als Primärschlüssel verwendet, werden neue Zeilen an zufälligen Positionen im Index eingefügt, was zur Fragmentierung des B-Tree-Index und zu geringerer Cache-Effizienz führen kann. Da ULIDs annähernd zeitlich sortiert sind, werden neue Zeilen tendenziell nahe dem Ende des Index angehängt, was dieses Problem abmildern soll.

Die ersten 10 Zeichen sind ein 48-Bit-Zeitstempel in Millisekunden (der Daten bis etwa zum Jahr 10889 darstellen kann), die restlichen 16 Zeichen sind 80 Bit Zufallswerte. Insgesamt ergibt das 128 Bit — genauso viel wie bei einer UUID —, jedoch mit eingebetteter Zeitinformation, was das charakteristische Merkmal der ULID ist.
ツールくん

Übrigens – wie ULID die chronologische Ordnung in die Welt der IDs brachte

Die ULID-Spezifikation wurde 2016 von Alizain Feerasta veröffentlicht. Zu dieser Zeit war UUID bereits der Standard zur Erzeugung eindeutiger IDs in verteilten Systemen, doch seine vollständig zufällige Natur — die eine Sortierung unmöglich machte — galt als unpraktisch für die Effizienz von Datenbankindizes und für die zeitliche Analyse von Logs. Genau dieses Problem sollte ULID lösen.

Tatsächlich besitzt auch UUID zeitbasierte Varianten: Version 1 (MAC-Adresse plus Zeitstempel) und Version 7 (2024 standardisiert, eine Kombination aus Zeitstempel und Zufallswerten). ULID ist jedoch eine eigenständige Spezifikation, unabhängig vom UUID-Standard (RFC 4122), und zeichnet sich durch ein einfacheres Design sowie eine kompakte Base32-Darstellung aus.

Heute existieren für nahezu alle wichtigen Programmiersprachen Implementierungsbibliotheken für ULID, und es wird überall dort eingesetzt, wo die Erzeugungsreihenfolge erhalten bleiben soll: bei Ereignis-IDs in verteilten Systemen, Trace-IDs in Logs und Primärschlüsseln in Datenbanken. In der Designphilosophie überschneidet es sich stark mit dem etwa zeitgleich entstandenen UUID v7, und beide existieren nebeneinander als unterschiedliche Ansätze für dasselbe Ziel: eine sortierbare, UUID-ähnliche Kennung.