03 / GUIDES
UUID vs. ULID: Kennungen für deine Anwendung wählen
UUID v4 versus v7, ULID-Struktur und Sortierbarkeit, was zufällige Kennungen mit einem B-Baum-Index machen, Kollisionswahrscheinlichkeit, Sichtbarkeit in URLs und lokales Generieren von Kennungen.
Was eine Anwendungs-Kennung leisten muss
Eine generierte Kennung hat eine Aufgabe – eindeutig sein – plus einige, die sie unterwegs aufsammelt: überall ohne Abstimmung generierbar, kompakt speicherbar, vorhersehbar sortierbar und nichts Peinliches verratend. UUID und ULID nehmen beide die Eindeutigkeitshürde; bei allem danach unterscheiden sie sich.
- Keine AbstimmungDezentrales Generieren: Jeder Dienst, Worker oder Browser-Tab kann eine Kennung prägen, ohne einen zentralen Zähler zu fragen – das macht beide Formate tauglich für verteilte Systeme.
- Dieselben 128 BitsSo oder so 128 Bits: Eine UUID ist ein 128-Bit-Wert, geschrieben als 36 Hexadezimalzeichen mit Bindestrichen; eine ULID trägt dieselben 128 Bits als 26 Base32-Zeichen.
- Layout ist der UnterschiedDie eigentliche Frage ist das Layout: Welche Bits zufällig sind und welche Zeit kodieren, entscheidet, wie sich die Kennung in einem Index verhält und was sie verrät.
UUID-Versionen: v4 ist zufällig, v7 ist zeitgeordnet
RFC 9562 definiert mehrere UUID-Versionen, aber zwei dominieren die Anwendungsarbeit. Version 4 füllt 122 der 128 Bits mit Zufall und bettet nichts weiter ein; Version 7 beginnt mit einem 48-Bit-Unix-Zeitstempel in Millisekunden und füllt die restlichen 74 Bits mit Zufall.
- v4: purer Zufallv4 ist die privatsphäre-maximale Wahl: Der Wert sagt nichts darüber, wann oder wo er entstand, und 122 Zufallsbits sind mehr Eindeutigkeit, als irgendeine Anwendung je verbrauchen wird.
- v7: Zeit zuerstv7 sortiert sich hauptsächlich nach seinem Zeitstempel in Millisekunden. Die Reihenfolge innerhalb derselben Millisekunde und über Geräte hinweg hängt vom Generator und vom Verhalten der Uhren ab.
- v1 überspringenÄltere Versionen sind Legacy: v1 bettete eine MAC-Adresse und einen Uhrenwert ein und leakte beides; v3 und v5 sind namensbasierte Hashes zum Ableiten stabiler IDs, kein frischer Zufall.
ULID: sortierbar und kompakt als Text
Eine ULID besteht aus 26 Zeichen Crockford-Base32: Die ersten 10 Zeichen kodieren einen 48-Bit-Millisekunden-Zeitstempel, die restlichen 16 kodieren 80 Zufallsbits. Das Alphabet schließt bewusst I, L, O und U aus, sodass Kennungen laut Vorgelesen oder Abtippen von einem Screenshot überleben.
- String-Sortierung = Zeit-SortierungLexikografische Ordnung ist Zeitordnung: ULIDs als schlichte Strings zu sortieren sortiert sie ohne Parsen nach Erzeugungszeit – nützlich in Log-Zeilen, Dateinamen und Key-Value-Stores.
- 26 sichere ZeichenKompakt und URL-sicher: 26 Zeichen ohne Beachtung der Groß-/Kleinschreibung, ohne Bindestriche oder Symbole, kürzer als die 36 einer UUID und sicher in jedem Pfadsegment oder Query-Parameter.
- Monoton pro MillisekundeInnerhalb einer Millisekunde kommt die Ordnung vom Zufallsteil; Generatoren, die ihn monoton hochzählen – wie der Toolars-Batch-Generator –, halten selbst Kennungen derselben Millisekunde in Generierungsreihenfolge.
Zufällige IDs fragmentieren deine Indizes
Ein B-Baum-Index ist geordnet, und das Einfügen einer zufälligen UUID v4 schreibt jedes Mal auf ein zufälliges Blatt: Seiten teilen sich, der Buffer-Cache rattert, und der Index schwillt mit totem Raum an. Zeitgeordnete Kennungen hängen nahe der rechten Kante des Index an und machen Einfügungen zum Best Case des B-Baums.
Darum gehört die Wahl zur Schema-Designzeit, nicht hinter das erste langsame Quartal: Einen Primärschlüssel zu migrieren heißt, jede Zeile und jeden Fremdschlüssel neu zu schreiben, der darauf verweist. Bleibt die Tabelle klein, wird v4s Unordnung nie sichtbar; wächst sie unter Dauerschreiben in Hunderte Millionen Zeilen, zahlen die geordneten Formate ab Tag eins Miete.
- Zufall verstreutMit v4 als Primärschlüssel zeigen schreiblastige Tabellen mehr Seitensplite, niedrigere Füllfaktoren und messbar schlechteren Schreibdurchsatz als mit einem geordneten Schlüssel gleicher Größe.
- Ordnung hängt anv7 und ULID verbessern die Indexlokalität bei dezentraler Erzeugung. Benachbarte IDs in einer monotonen Folge können vorhersagbar sein; erzwinge Berechtigungen unabhängig von der Kennung.
- Den Tausch messenDer Tausch ist real, aber bescheiden: 128 Bits sind das Doppelte des Speichers eines bigint, und zeitgeordnete Schlüssel konzentrieren die heutigen Schreibzugriffe auf die rechte Indexkante – was nur bei sehr hohen Einfügeraten zählt.
Kollisionen, URLs und was eine ID verrät
Zuerst die Kollisionsrechnung: Bei 122 unabhängigen Zufallsbits in v4 liegt die Kollisionswahrscheinlichkeit für eine Milliarde Kennungen ungefähr bei eins zu 10^19. Die 80 Zufallsbits einer ULID betreffen einen anderen Fall: Kennungen, die innerhalb derselben Millisekunde entstehen.
Füge jeden verdächtigen Wert in den Validator ein: Er erkennt die kanonische 36-Zeichen-UUID-Form mit ihrem RFC-9562-Varianten- und Versions-Nibble, das 26-Zeichen-ULID-Alphabet mit seiner Überlaufregel, und er meldet den eingebetteten Zeitstempel bei zeitgeordneten Formaten – ein Wert aus einem Log sagt dir also, was er ist, bevor du darauf aufbaust.
- Wahrscheinlichkeit ist vernachlässigbarKeines der Formate ist eine Sicherheitsgrenze: Eine Kennung in einer URL ist zum Adressieren in Ordnung, aber jeder, der sie sieht, kann sie zitieren – Autorisierung muss von Zugriffsprüfungen kommen, nicht von ID-Undurchsichtigkeit.
- IDs sind keine Geheimnissev7 und ULID leaken die Erzeugungszeit per Design; der Validator extrahiert sie offen. Das ist meist harmlose Metainformation, aber entscheide es bewusst für öffentlich sichtbare Objekte.
- Zeit ist sichtbarSequenzielle Datenbank-IDs leaken Volumen und Wachstumsrate; zufällige und zeit-zufällige Kennungen verraten nichts darüber, wie viele Datensätze existieren.
Generieren und validieren ohne Server
Kennungsgenerierung braucht exakt eine knappe Ressource – guten Zufall –, und der Browser hat sie bereits. Der Arbeitsbereich schöpft aus crypto.getRandomValues, generiert Batches vollständig im Tab und überträgt nie einen Wert.
- 1–100 pro BatchWähle UUID v4, UUID v7 oder ULID und generiere 1 bis 100 pro Batch; v7- und ULID-Batches zählen das Zufallsfeld monoton hoch, ein ganzer Batch bleibt also in Generierungsreihenfolge.
- Schreibweise und ExportGroß-/Kleinschreibung der Ausgabe ist eine Darstellungswahl: kanonisch, groß oder klein, mit Alle-kopieren plus zeilengetrennten Text- und CSV-Downloads, die die eingebettete Zeit jeder Kennung festhalten.
- Sofortige ValidierungDie Validierung beantwortet Strukturfragen sofort: Länge, Alphabet, UUID-Version und -Variante, Nil- und Max-Sonderwerte, ULID-Überlauf und der eingebettete Zeitstempel in UTC.
ULID ist Base32; deine Tokens sind wahrscheinlich Base64.
Byte-zu-Text-Kodierungen liegen unter jeder Kennung und jedem Token – lerne, was sie kosten und wo sie ihren Platz verdienen.