UUID, ULID, Nanoid: Welche eindeutige ID sollten Sie 2026 wählen?

UUID, ULID, Nanoid: Welche eindeutige ID sollten Sie 2026 wählen?

Zufälliger UUID v4, sortierbare UUID v7 und ULID, kompakter Nanoid: Vergleich und Online-Generatoren für Primärschlüssel und öffentliche IDs.

23.09.2026
11 Min. Lektüre
Teilen Sie diesen Artikel:
uuid
ulid
nanoid
identifiers
database
tools-dev

Zufällig, sortierbar oder kompakt: drei verschiedene Aufgaben für eine Zeichenkette

Ein einfacher Auto-Increment verrät, wie viele Zeilen eine Tabelle hat, lässt sich schlecht zwischen mehreren gleichzeitig schreibenden Servern koordinieren und ist erratbar — die ID 1042 legt nahe, dass es eine ID 1041 gibt. Deshalb erzeugen Anwendungen IDs client- oder serverseitig ohne zentralen Zähler. Aber „eindeutig und unvorhersehbar" bedeutet je nach Format nicht dasselbe. Der UUID-Generator erzeugt eine rein zufällige UUID v4, eine UUID v7, deren führende Bits einen Zeitstempel kodieren (also sortierbar ist), oder die nil-UUID zu Testzwecken. Der ULID-Generator verfolgt dasselbe Ziel wie UUID v7 — eine nach Erstellungszeit sortierbare ID — mit einer kürzeren Base32-Schreibweise. Der Nanoid-Generator verzichtet ganz auf den eingebetteten Zeitstempel, um die Zeichenkettenlänge bei gegebenem Entropie-Budget zu optimieren. Alle drei laufen vollständig im Browser und liegen zusammen im Hub der Entwickler-Utilities, neben dem Regex-Tester und dem Passwort-Generator.

UUID: Version v4 (zufällig), v7 (sortierbar, 48-Bit-Zeitstempel) oder nil; Bindestriche, Großschreibung und Format (einfach, geschweifte Klammern, urn:uuid:) einstellbar; 1 bis 50 IDs pro Durchgang
ULID: 26 Zeichen in Crockford-Base32, standardmäßig Großbuchstaben, ein monotoner Modus für garantierte Reihenfolge im selben Durchgang, dekodierter Zeitstempel unter jeder erzeugten ID
Nanoid: Größe einstellbar von 2 bis 64 Zeichen (Standard 21, Presets 8/12/16/21/32), Alphabet url / alphanumerisch / numerisch / ohne verwechselbare Zeichen / benutzerdefiniert bis 256 Zeichen, Entropie live angezeigt
Alle drei erzeugen über die Web-Crypto-API des Browsers, ohne Datenübertragung; ohne crypto.getRandomValues zeigen ULID und Nanoid eine Fehlermeldung statt einer schwächeren ID
Kein „Generieren"-Button: Die Liste aktualisiert sich sofort bei jeder Optionsänderung, mit Alle-kopieren, .txt-Download oder zeilenweisem Kopieren

Das richtige Werkzeug für den jeweiligen Kontext wählen

Gute Einsatzzwecke für den Online-Generator

Prototyping, Tests und visuelle Prüfungen, bevor auch nur eine Zeile Server-Code geschrieben wird.

Ein Datenbankschema entwerfen und v7-Schlüssel sofort mit v4-Schlüsseln vergleichen
Testdaten oder Fixtures erzeugen — 10 bis 50 IDs auf einmal, kopiert oder als .txt heruntergeladen
Visuell prüfen, dass der monotone Modus des ULID-Generators innerhalb eines Durchgangs eine aufsteigende Reihenfolge einhält, bevor man sich serverseitig darauf verlässt
Die reale Entropie eines benutzerdefinierten Nanoid (Alphabet, Größe) neu berechnen, bevor sie in einer API-Spezifikation festgeschrieben wird
Eine Teamdiskussion über sortierbar vs. zufällig veranschaulichen, ohne eine Zeile Code zu schreiben
Was serverseitig oder in einer Bibliothek bleiben sollte

Der Online-Generator prototypt das Format; er ersetzt keine Generierung im Produktionsmaßstab.

ID-Generierung mit hohem Durchsatz in Produktion — eine Server-Bibliothek (uuid, ulid, nanoid unter Node) vermeidet jeden Browser-Roundtrip
Sicherheits-Tokens (Passwort-Reset, Session, Einladung) — ein dediziertes Secret, nie ein wiederverwendeter öffentlicher Bezeichner
Autorisierungsprüfung auf einer Ressource — eine unvorhersehbare ID ersetzt nie eine serverseitige Besitzprüfung
Migration eines bestehenden Auto-Increment zu UUID oder ULID in Produktion — Doppelschreibung und neuen Index planen, bevor der alte Zähler abgeschaltet wird

Fehler, die in Produktion teuer werden

Zufällige UUID v4 als indizierten Primärschlüssel verwenden

Ein mit UUID-v4-Werten gefüllter Primärschlüssel fügt jede neue Zeile an einer zufälligen Position im B-Tree-Index ein, was Seiten fragmentiert und Schreibvorgänge bei einer stark beschriebenen Tabelle verlangsamt. Das ist kein UUID-Problem im Allgemeinen, sondern ein Problem reiner Zufälligkeit: UUID v7 (RFC 9562) kodiert einen Millisekunden-Zeitstempel in den führenden 48 Bits und füllt den Rest zufällig auf, ULID macht dasselbe in Base32. Beide hängen sich ans Ende des Index an, wie ein Auto-Increment, ohne einen nutzbaren Zähler preiszugeben. Der UUID-Generator wechselt von v4 zu v7, ohne die Feldform zu ändern (36 Zeichen mit Bindestrichen); der ULID-Generator bietet die kürzere 26-Zeichen-Alternative.

Reflexartig v4 für einen schreibintensiven Primärschlüssel wählen und die Indexfragmentierung erst in Produktion entdecken
Annehmen, eine „zufällige" UUID sei zwangsläufig sicherer als eine „sortierbare" — der Zufallsanteil von v7 oder ULID bleibt groß (74 bis 80 Bit), nur die Einfügereihenfolge ändert sich
v4 und v7 in derselben Spalte mischen und erwarten, dass sie sich chronologisch vergleichen lassen
Nie prüfen, ob Datenbank oder ORM bereits eine sortierbare ID für indizierte Schlüssel empfehlen
Annehmen, eine unvorhersehbare ID ersetze eine Autorisierungsprüfung

Ein Auto-Increment durch UUID, ULID oder Nanoid zu ersetzen verhindert triviales Durchprobieren (?id=124, dann 125…), prüft aber niemandes Berechtigung: Eine über einen anderen Kanal erlangte ID — geteilter Link, Log-Zeile, Referrer-Header — bleibt lesbar, wenn die API den Besitz der Ressource nicht kontrolliert. ULID hat ein zusätzliches Problem: Die ersten 10 Zeichen kodieren den Erstellungszeitstempel im Klartext. Für einen Primärschlüssel unbedenklich, für ein Token, das opak bleiben soll, nicht — wer die Erstellungszeit ungefähr kennt, verkleinert den Suchraum, noch bevor er den zufälligen Teil angreift.

Eine serverseitige Besitzprüfung weglassen, weil die ID „schwer zu erraten" ist
Eine ULID als Token für Passwort-Reset oder Einladung verwenden, in der Annahme, sie sei so opak wie ein dediziertes Secret
ULIDs in öffentlichen URLs veröffentlichen, ohne zu bemerken, dass sie den Erstellungszeitpunkt der Ressource preisgeben
Den monotonen Modus des ULID-Generators nie testen, bevor man sich serverseitig auf eine garantierte Reihenfolge innerhalb derselben Millisekunde verlässt
Nanoid-Alphabet oder -Größe verkleinern, ohne die Entropie neu zu berechnen

Die Kollisionsresistenz eines Nanoid hängt vollständig vom Produkt Größe × Alphabet ab. Die Voreinstellung des Werkzeugs (21 Zeichen über dem 64-Zeichen-url-Alphabet) zielt bei realistischer Generierungsrate auf eine Kollisionswahrscheinlichkeit ähnlich einer UUID v4 — aber jedes Preset ändert diese Rechnung. Der Wechsel zum Alphabet „numeric" (10 Symbole) oder eine Verkürzung auf 6-8 Zeichen für einen kürzeren Slug kann den ID-Raum um mehrere Größenordnungen verkleinern, ohne dass etwas darauf hinweist außer dem live angezeigten Entropiezähler neben dem Größenfeld.

Zum numerischen Alphabet wechseln für eine ID, die im großen Maßstab eindeutig bleiben muss, ohne die angezeigte Entropie neu zu prüfen
Auf 6-8 Zeichen für einen „kürzeren" Slug reduzieren, ohne die reale Generierungsrate abzuschätzen
Ein benutzerdefiniertes Alphabet mit doppelten Zeichen einfügen und die angezeigte Länge erwarten — Duplikate werden automatisch entfernt
Das Alphabet „ohne verwechselbare Zeichen" (gedacht für laut vorgelesene Codes) mit einem auf Informationsdichte ausgelegten Alphabet verwechseln
Formatvarianten innerhalb desselben Datensatzes mischen

Die Formatauswahl des UUID-Werkzeugs (einfach, geschweifte Klammern, urn:uuid:) und der Groß-/Kleinschreibungsschalter ändern die Textdarstellung, nicht die zugrunde liegenden 128 Bits — aber eine Spalte mit reinem String-Vergleich weiß nicht, dass {550e8400-…} und urn:uuid:550e8400-… dieselbe UUID bezeichnen, ohne vorherige Normalisierung. Dieselbe Logik gilt für ULID: Crockford-Base32 ist beim Dekodieren als groß-/kleinschreibungsunabhängig definiert, eine UNIQUE-Constraint auf einer Zeichenkette dagegen nicht.

UUIDs im Format urn:uuid: für einen Export erzeugen und sie unverändert mit bereits in der Datenbank gespeicherten reinen UUIDs vergleichen
Geschweifte Klammern für einen manuellen Test aktivieren und vergessen, sie vor dem Import zu entfernen
ULIDs mal in Großbuchstaben (clientseitig erzeugt), mal in Kleinbuchstaben (serverseitig neu berechnet) speichern
Groß-/Kleinschreibung und Bindestriche vor einem Gleichheitstest oder einer UNIQUE-Constraint nicht normalisieren

Format, Größe, Sortierung: was die vier Varianten wirklich unterscheidet

UUID v4, UUID v7, ULID, Nanoid

Dasselbe Ziel — Eindeutigkeit ohne zentralen Koordinator — vier verschiedene Formen.

UUID v4: 128 Bit, davon 122 zufällig, 36 Zeichen mit Bindestrichen (z. B. 550e8400-e29b-41d4-a716-446655440000). Nicht nach Erstellungszeit sortierbar. Das am weitesten verbreitete Format, nativ in fast jeder Datenbank unterstützt (RFC 9562).
UUID v7: gleiche 36-Zeichen-Form, aber die führenden 48 Bits kodieren einen Millisekunden-Zeitstempel — lexikografisch wie chronologisch sortierbar und dabei eine standardkonforme UUID.
ULID: 26 Zeichen in Crockford-Base32 (z. B. 01HXYZ0123456789ABCDEFGHJK), 48 Bit Zeit plus 80 Zufallsbits. Gleiches Sortierverhalten wie UUID v7, kürzere Zeichenkette, beim Dekodieren groß-/kleinschreibungsunabhängig.
Nanoid: einstellbare Länge von 2 bis 64 Zeichen (Standard 21), einstellbares Alphabet. Kein eingebetteter Zeitstempel — ein Nanoid sortiert nicht nach Erstellungszeit. Bei vergleichbarem Entropie-Budget das kompakteste der vier.
Was die FastMinify-Generatoren tatsächlich bieten

Die realen Optionen jedes Werkzeugs, wie sie heute existieren.

uuid-generator: Versionen v4 / v7 / nil, Bindestriche an/aus, Großschreibung an/aus, Format einfach / geschweifte Klammern / urn:uuid: (urn erzwingt Bindestriche an und Großschreibung aus), 1 bis 50 IDs pro Durchgang (bei nil auf 1 erzwungen).
ulid-generator: standardmäßig Großbuchstaben, monotoner Modus (erhöht den Zufallsanteil statt im selben Durchgang neu zu ziehen), dekodierter Zeitstempel unter jeder erzeugten ID, 1 bis 50 pro Durchgang.
nanoid-generator: Größe 2-64 mit Presets 8/12/16/21/32, Alphabet url (Standard) / alphanumerisch / numerisch / ohne verwechselbare Zeichen / benutzerdefiniert (bis 256 Zeichen, automatisch dedupliziert), Entropie live angezeigt, 1 bis 50 pro Durchgang.
Alle drei laufen vollständig im Browser über Web Crypto, ohne Datenübertragung; ULID und Nanoid haben keinen unsicheren Fallback — ohne crypto.getRandomValues zeigt das Werkzeug einen Fehler statt einer schwächeren ID.
Wann Sortierbarkeit wirklich den Unterschied macht

Drei konkrete Situationen, in denen die Formatwahl messbare Auswirkungen hat.

Schreibintensive Tabelle mit indiziertem Primärschlüssel: v4 fragmentiert den Index durch zufällige Einfügungen; v7 oder ULID hängen sich ans Ende des Index, wie ein Auto-Increment, ohne einen Zähler preiszugeben.
„Neueste zuerst"-Sortierung ohne dedizierte created_at-Spalte: bei v7 und ULID direkt auf der ID möglich (lexikografische Reihenfolge = chronologische Reihenfolge), bei v4 oder Nanoid unmöglich.
Synchronisation zwischen verteilten Systemen ohne zentralen Koordinator: alle vier Formate garantieren Eindeutigkeit ohne zentralen Server — genau das, was ein Auto-Increment nicht kann.
Kürzeste öffentliche URL bei vergleichbarem Entropie-Budget: ein 21-Zeichen-Nanoid (Standard) schlägt die 36 Zeichen einer UUID und die 26 einer ULID.

Generieren, anpassen, kopieren

UUID und ULID: Version wählen, dann Format anpassen

Im UUID-Generator aktualisiert sich die Liste, sobald Sie eine Option ändern — es gibt keinen separaten „Generieren"-Button. Im ULID-Generator erscheint der dekodierte Zeitstempel jeder ID direkt unter der erzeugten Zeile.

1

Schritt 1 — Version oder Sortieroption wählen

UUID: v4 für reine Zufälligkeit, v7 für Sortierbarkeit, nil für die Test-UUID aus lauter Nullen (die Anzahl wird dann auf 1 erzwungen). ULID: monotonen Modus aktivieren, wenn mehrere IDs innerhalb derselben Millisekunde erzeugt werden und eine garantierte Reihenfolge nötig ist.

2

Schritt 2 — Bindestriche, Groß-/Kleinschreibung und Format anpassen

Bei UUID erzwingt die Wahl des Formats urn:uuid: automatisch Bindestriche und deaktiviert den Schalter für Groß-/Kleinschreibung. Bei ULID sind Großbuchstaben standardmäßig aktiv; die Crockford-Base32-Dekodierung bleibt auch in Kleinbuchstaben korrekt.

3

Schritt 3 — Anzahl (1 bis 50) einstellen und kopieren

Kopieren Sie die gesamte Liste auf einmal, laden Sie sie als .txt herunter, oder kopieren Sie mit dem Button je Zeile einzeln.

Nanoid: Größe und Alphabet einstellen, bevor Sie kopieren

Der Nanoid-Generator zeigt die Entropie in Bits live an, sobald Sie Größe oder Alphabet ändern, damit Sie sie nie von Hand berechnen müssen.

Größe: 2 bis 64 Zeichen, Schnellpresets 8 / 12 / 16 / 21 / 32
Alphabet: url (Standard, ohne + / =, damit es direkt in eine URL passt), alphanumerisch, numerisch, ohne verwechselbare Zeichen (0/O und 1/l/I ausgeschlossen), oder benutzerdefiniert bis 256 Zeichen
Ein benutzerdefiniertes Alphabet wird automatisch dedupliziert und braucht mindestens 2 unterschiedliche Zeichen, um generieren zu können
1 bis 50 IDs pro Durchgang, Alle-kopieren, .txt-Download oder zeilenweises Kopieren
Kein Fallback, wenn der Browser kein crypto.getRandomValues bietet — eine Fehlermeldung ersetzt die Liste, statt eine schwächere ID zu erzeugen

Dieselben Formate serverseitig, in Node

UUID v4 und v7 in Node

Node stellt crypto.randomUUID() nativ für eine UUID v4 bereit, ganz ohne Abhängigkeit. Das eingebaute crypto-Modul erzeugt kein v7 — ein kleines npm-Paket wie uuid übernimmt die sortierbare Variante.

Einfaches Beispiel

const crypto = require('node:crypto') // v4 — in Node eingebaut, keine Abhängigkeit const id = crypto.randomUUID() // v7 — Nodes crypto.randomUUID() erzeugt nur v4 const { v7: uuidv7 } = require('uuid') const sortableId = uuidv7()
ULID in Node

Node hat keine eingebaute ULID-Unterstützung. Das Paket ulid bietet Generierung und Dekodierung des eingebetteten Zeitstempels.

Einfaches Beispiel

const { ulid, decodeTime } = require('ulid') const id = ulid() // 26 Zeichen, Großbuchstaben const createdAtMs = decodeTime(id)
Nanoid in Node

Das Paket nanoid entspricht dem Standard-url-Alphabet und der Standardgröße des Werkzeugs (21 Zeichen), mit customAlphabet für ein maßgeschneidertes Alphabet oder eine andere Größe.

Einfaches Beispiel

const { nanoid, customAlphabet } = require('nanoid') const id = nanoid() // 21 Zeichen, Standard-url-Alphabet const numericId = customAlphabet('0123456789', 12)()
FastMinify uuid-generator / ulid-generator / nanoid-generator

Keine Installation, keine Datenübertragung, bis zu 50 IDs pro Durchgang, vollständige Formatoptionen für alle drei Formate. Kompromiss: keine Generierung mit hohem Durchsatz im Browser, keine Monotonie-Garantie über mehrere Tabs oder Prozesse hinweg, und ein benutzerdefiniertes Nanoid-Alphabet auf 256 Zeichen begrenzt. Nutzen Sie die Seiten, um ein Schema zu entwerfen oder Fixtures zu erzeugen; behalten Sie uuid, ulid und nanoid serverseitig für die Produktion.

Fazit

Es gibt keinen absolut „besten" Bezeichner. UUID v4 bleibt die richtige Wahl für eine rein opake ID ohne Sortieranforderung und mit der breitesten nativen Unterstützung. UUID v7 oder ULID übernehmen, sobald die Einfügereihenfolge für die Indexleistung oder für eine anwendungsseitige Sortierung ohne dedizierte created_at-Spalte zählt. Nanoid zielt auf die kürzestmögliche Zeichenkette bei gegebenem Entropie-Budget, besonders in einer URL. Keines der drei ersetzt eine serverseitige Autorisierungsprüfung, und keines ist für Generierung mit hohem Durchsatz im Browser gedacht — dafür gibt es die Server-Bibliotheken uuid, ulid und nanoid. Wandern diese IDs durch die JSON-Nutzlast einer API, passt der Leitfaden zur Optimierung einer JSON-REST-API gut dazu, ebenso der JSON-Schema-Validator, um die erwartete Form eines id-Felds zu prüfen.

UUID v4 für eine rein opake ID ohne Sortieranforderung
UUID v7 oder ULID, sobald die Einfügereihenfolge für den Index oder eine anwendungsseitige Sortierung zählt
Nanoid für die kürzestmögliche Zeichenkette bei gegebenem Entropie-Budget, besonders in einer URL
Keines der drei ersetzt eine serverseitige Autorisierungsprüfung
Produktion mit hohem Durchsatz: eine Server-Bibliothek (uuid, ulid, nanoid), nicht der Browser-Generator
Teilen Sie diesen Artikel
Teilen Sie diesen Artikel: