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:
uuidulidnanoididentifiersdatabasetools-dev

Zufällige, sortierbare und kompakte IDs für verschiedene Aufgaben

Ein einfacher Auto-Increment verrät, wie viele Zeilen eine Tabelle hat. Er lässt sich schlecht zwischen mehreren Servern abstimmen, die gleichzeitig schreiben. Er ist auch leicht zu erraten: Wer die ID 1042 sieht, vermutet eine ID 1041. Deshalb erzeugen Anwendungen IDs im Client oder auf dem Server, ohne zentralen Zähler. „Eindeutig und unvorhersehbar“ bedeutet aber nicht in jedem Format dasselbe. Der UUID-Generator erzeugt eine zufällige UUID v4, eine UUID v7, die mit einem Zeitstempel beginnt, oder die Nil-UUID für Tests. Der ULID-Generator verfolgt dasselbe Ziel wie UUID v7, eine nach Erstellungszeit sortierbare ID, mit einer kürzeren Base32-Zeichenkette. Der Nanoid-Generator verzichtet auf den Zeitstempel und nutzt jedes Zeichen für Zufall. So wird die Zeichenkette bei gleicher Entropie kürzer. Alle drei laufen im Browser und liegen zusammen im Hub der Entwickler-Utilities, neben dem Regex-Tester und dem Passwort-Generator.

UUID: v4, v7 oder nil, Bindestriche und Großbuchstaben schaltbar, drei Formate (einfach, geschweifte Klammern, URN), 1 bis 50 IDs pro Liste
ULID: 26 Zeichen in Crockford-Base32, standardmäßig Großbuchstaben, Option „Monoton“ für eine aufsteigende Liste, dekodierter Zeitstempel unter jeder ID
Nanoid: jede Größe von 2 bis 64 (Standard 21, fünf Vorgaben), Alphabet URL-sicher, alphanumerisch, numerisch, ohne Verwechslungszeichen oder benutzerdefiniert, Entropie in Bits
Alle drei erzeugen ihre IDs über die Web-Crypto-API des Browsers und laden nichts hoch; ohne crypto.getRandomValues zeigen ULID und Nanoid einen Fehler
Keine Schaltfläche „Generieren“: Die Liste wird bei jeder Optionsänderung neu erzeugt, mit „Alle kopieren“, Download als .txt-Datei und einer Kopierschaltfläche je Zeile

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 direkt mit v4-Schlüsseln vergleichen
Testdaten oder Fixtures erzeugen, 10 bis 50 IDs auf einmal, kopiert oder als .txt-Datei heruntergeladen
Prüfen, dass „Monoton“ im ULID-Generator eine Liste aufsteigend hält, bevor man sich serverseitig auf dasselbe Verhalten 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 dient zum Ausprobieren des Formats. Für die Erzeugung im Produktionsmaßstab ist er nicht gedacht.

ID-Erzeugung mit hohem Durchsatz in Produktion: Eine Server-Bibliothek (uuid, ulid, nanoid unter Node) kommt ohne Browser aus
Sicherheits-Tokens (Passwort-Reset, Session, Einladung): ein eigenes 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: Doppeltes Schreiben 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 Primärschlüssel aus UUID-v4-Werten fügt jede neue Zeile an einer zufälligen Stelle im B-Tree-Index ein. Bei einer stark beschriebenen Tabelle fragmentiert das die Seiten und bremst Schreibvorgänge. Die Ursache ist reiner Zufall, nicht die UUID an sich. UUID v7 (RFC 9562) legt einen Millisekunden-Zeitstempel in die ersten 48 Bit und füllt den Rest mit Zufallsbits. ULID setzt dieselbe Idee in Base32 um. Neue Werte landen dann am Ende des Index, wie bei einem Auto-Increment, ohne einen nutzbaren Zähler preiszugeben. Laut RFC 9562 kann der Unterschied eine Größenordnung oder mehr betragen. Der UUID-Generator wechselt von v4 zu v7, ohne die Form des Felds zu ändern (36 Zeichen mit Bindestrichen). Der ULID-Generator bietet die kürzere Variante mit 26 Zeichen.

Reflexartig v4 für einen schreibintensiven Primärschlüssel wählen und die Indexfragmentierung erst in Produktion entdecken
Annehmen, eine „zufällige“ UUID sei sicherer als eine „sortierbare“, obwohl eine v7 noch 74 Zufallsbits enthält und eine ULID 80
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
Behalten Sie v4 für einen rein opaken Bezeichner (Session, Nonce, Token). Wechseln Sie zu v7 oder ULID, sobald die Tabelle fortlaufend beschrieben wird und die Einfügereihenfolge für die Indexleistung zählt.
Annehmen, eine unvorhersehbare ID ersetze eine Autorisierungsprüfung

Wer einen Auto-Increment durch UUID, ULID oder Nanoid ersetzt, verhindert einfaches Durchprobieren (?id=124, dann 125…). Eine Berechtigungsprüfung ersetzt das nicht. Eine anderswo bekannt gewordene ID (geteilter Link, Log-Zeile, Referer-Header) bleibt lesbar, wenn die API den Besitz der Ressource nicht prüft. ULID bringt ein eigenes Problem mit. Die ersten 10 Zeichen verraten den Erstellungszeitpunkt im Klartext. Für einen Primärschlüssel ist das harmlos. Für ein Token, das opak bleiben soll, nicht: Wer den Erstellungszeitpunkt ungefähr kennt, verkleinert den Suchraum, bevor er den Zufallsteil 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
Sich auf eine monotone Reihenfolge über mehrere Listen oder Prozesse verlassen, obwohl „Monoton“ nur die IDs einer Liste abdeckt
UUID, ULID und Nanoid ersetzen einen Zähler, keine Session und kein Secret. Für ein kurzlebiges Token generieren Sie einen dedizierten Wert und prüfen Sie die Autorisierung immer serverseitig.
Nanoid-Alphabet oder -Größe verkleinern, ohne die Entropie neu zu berechnen

Die Kollisionsresistenz eines Nanoid hängt von Größe und Alphabet zugleich ab. Die Voreinstellung des Werkzeugs, 21 Zeichen aus dem URL-sicheren Alphabet mit 64 Symbolen, trägt 126 Zufallsbits, gegenüber 122 bei einer UUID v4. Jede andere Einstellung ändert diese Rechnung. Bei 8 Zeichen aus demselben Alphabet erreicht die Wahrscheinlichkeit mindestens einer Kollision nach etwa 2,4 Millionen IDs 1 %. Das Alphabet „Numerisch“ (10 Symbole) verkleinert den Raum ebenfalls: 21 Ziffern ergeben rund 70 Bit. Nichts warnt Sie davor, außer der Entropie in Bits im Tooltip neben dem Feld „Größe“.

Zum Alphabet „Numerisch“ wechseln, obwohl die ID in großer Menge eindeutig bleiben muss, ohne die angezeigte Entropie erneut zu prüfen
Für einen „kürzeren“ Slug auf 6 bis 8 Zeichen gehen, ohne abzuschätzen, wie viele IDs tatsächlich entstehen
Ein Alphabet mit doppelten Zeichen einfügen und mit seiner vollen Länge rechnen, obwohl das Werkzeug Duplikate entfernt, bevor es die Entropie berechnet
Das Alphabet „Ohne Verwechslungszeichen“ (gedacht für laut vorgelesene Codes) mit einem auf Informationsdichte ausgelegten Alphabet verwechseln
Ein verkürzter Nanoid kann im Test unauffällig wirken und bei echtem Produktionsvolumen trotzdem kollidieren, weil niemand die Entropie neu berechnet hat.
Formatvarianten innerhalb desselben Datensatzes mischen

Die Formatauswahl des UUID-Werkzeugs (einfach, geschweifte Klammern, URN) und der Schalter für Großbuchstaben ändern die Schreibweise, nicht die 128 Bit dahinter. Eine Spalte mit reinem Textvergleich erkennt nicht, dass {550e8400-…} und urn:uuid:550e8400-… dieselbe UUID bezeichnen, solange niemand normalisiert. Bei ULID lauert dieselbe Falle. Crockford-Base32 ignoriert beim Dekodieren die Groß- und Kleinschreibung, eine UNIQUE-Constraint auf einer Textspalte beachtet sie dagegen oft, wie PostgreSQL standardmäßig.

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 in Großbuchstaben speichern, wenn der Client sie erzeugt, und in Kleinbuchstaben, wenn der Server sie neu berechnet
Groß-/Kleinschreibung und Bindestriche vor einem Gleichheitstest oder einer UNIQUE-Constraint nicht normalisieren
Wählen Sie ein einziges Speicherformat (typischerweise kleingeschrieben, mit Bindestrichen, ohne Präfix) und normalisieren Sie jeden externen Wert vor dem Vergleich.

Format, Größe und Sortierung der vier Varianten

UUID v4, UUID v7, ULID, Nanoid

Dasselbe Ziel, Eindeutigkeit ohne zentralen Koordinator, in vier verschiedenen Formen.

UUID v4 (RFC 9562): 128 Bit, davon 122 zufällig, 36 Zeichen mit Bindestrichen, etwa 550e8400-e29b-41d4-a716-446655440000. Die 4 am Anfang der dritten Gruppe ist die Version. Nicht nach Erstellungszeit sortierbar. Das am weitesten verbreitete Format, mit eigenem Datentyp in PostgreSQL und MariaDB.
UUID v7: dieselbe Form mit 36 Zeichen, aber die ersten 48 Bit enthalten einen Millisekunden-Zeitstempel, und die Versionsziffer ist 7. Sie lässt sich auch als Text nach Zeit sortieren und bleibt eine Standard-UUID mit 74 Zufallsbits.
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 unabhängig von Groß- und Kleinschreibung.
Nanoid: Länge von 2 bis 64 Zeichen (Standard 21) und frei wählbares Alphabet. Ohne eingebetteten Zeitstempel lässt sich ein Nanoid nicht nach Erstellungszeit sortieren. Bei vergleichbarer Entropie das kompakteste der vier Formate.
Was die FastMinify-Generatoren tatsächlich bieten

Die realen Optionen jedes Werkzeugs, wie sie heute existieren.

uuid-generator: Version v4, v7 oder nil, Bindestriche und Großbuchstaben schaltbar, Format einfach, geschweifte Klammern oder URN, 1 bis 50 IDs pro Liste. URN erzwingt Bindestriche und Kleinbuchstaben, nil liefert immer genau eine ID. Jede v7-Zeile zeigt ihren Zeitstempel.
ulid-generator: standardmäßig Großbuchstaben, Option „Monoton“, dekodierter Zeitstempel unter jeder ID, 1 bis 50 pro Liste. Alle IDs einer Liste teilen dieselbe Millisekunde. „Monoton“ erhöht den vorigen Zufallsteil um eins, statt einen neuen zu ziehen.
nanoid-generator: Größe 2 bis 64 (Vorgaben 8, 12, 16, 21 und 32), Entropie in Bits, 1 bis 50 pro Liste. Das Alphabet ist standardmäßig URL-sicher, sonst alphanumerisch, numerisch, ohne Verwechslungszeichen oder benutzerdefiniert. Ein eigenes Alphabet fasst bis zu 256 Zeichen, doppelte Zeichen werden entfernt.
Alle drei laufen im Browser über Web Crypto und laden nichts hoch. ULID und Nanoid haben keinen schwächeren Ersatz: Ohne crypto.getRandomValues zeigen sie einen Fehler statt einer Liste. Der UUID-Generator greift in diesem Fall auf Math.random zurück.
Wann die Sortierreihenfolge wirklich zählt

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

Schreibintensive Tabelle mit indiziertem Primärschlüssel: v4 verteilt Einfügungen über den ganzen Index. Eine v7 oder eine ULID hängt sich hinten an, wie ein Auto-Increment, ohne einen Zähler preiszugeben.
Sortierung „Neueste zuerst“ ohne eigene created_at-Spalte: bei v7 und ULID direkt über die ID möglich (Textreihenfolge = Zeitreihenfolge), bei v4 oder Nanoid nicht.
Synchronisation verteilter Systeme ohne zentralen Koordinator: Alle vier Formate halten IDs in der Praxis eindeutig, 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-Generator einstellen

Im UUID-Generator wird die Liste neu erzeugt, sobald Sie eine Option ändern. Eine eigene Schaltfläche „Generieren“ gibt es nicht. Im ULID-Generator erscheint der dekodierte Zeitstempel jeder ID direkt unter ihrer Zeile.

1

1. Version oder Option „Monoton“ wählen

Bei UUID liefert v4 reinen Zufall, v7 eine zeitliche Reihenfolge und nil die UUID aus lauter Nullen, dann immer genau eine. Die v7-IDs einer Liste teilen meist dieselbe Millisekunde und sind untereinander nicht sortiert. Bei ULID teilen alle IDs einer Liste dieselbe Millisekunde und erscheinen in zufälliger Reihenfolge. Schalten Sie „Monoton“ ein, um eine streng aufsteigende Liste zu erhalten.

2

2. Bindestriche, Schreibweise und Format anpassen

Bei UUID erzwingt das Format URN Bindestriche und Kleinbuchstaben und sperrt beide Schalter. Bei ULID sind Großbuchstaben voreingestellt; Crockford-Base32 lässt sich in Kleinbuchstaben genauso dekodieren.

3

3. Anzahl (1 bis 50) einstellen und kopieren

Kopieren Sie die ganze Liste auf einmal, laden Sie sie als .txt-Datei herunter oder kopieren Sie eine einzelne Zeile über ihre Kopierschaltfläche.

Größe und Alphabet des Nanoid vor dem Kopieren einstellen

Der Nanoid-Generator zeigt die Entropie in Bits im Tooltip der Schaltfläche neben „Größe“. Der Wert folgt jeder Änderung von Größe oder Alphabet, Sie müssen ihn also nicht von Hand berechnen.

Größe: 2 bis 64 Zeichen, per Schieberegler, Zahlenfeld oder Vorgabe 8 / 12 / 16 / 21 / 32
Alphabet: standardmäßig URL-sicher, sonst alphanumerisch, numerisch, ohne Verwechslungszeichen (kein 0, O, o, I, l, 1) oder benutzerdefiniert bis 256 Zeichen
Ein benutzerdefiniertes Alphabet verliert doppelte Zeichen und braucht mindestens 2 verschiedene
1 bis 50 IDs pro Liste, „Alle kopieren“, Download als .txt-Datei oder Kopierschaltfläche je Zeile
Kein Ersatz, 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 liefert crypto.randomUUID() für eine UUID v4, ohne Abhängigkeit. Seit Node 24.16 und 26.1 erzeugt crypto.randomUUIDv7() auch eine v7. Bei älteren Versionen übernimmt das kleine Paket uuid die sortierbare Variante, wie im Beispiel.

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 erzeugt ULIDs und dekodiert ihren eingebetteten Zeitstempel.

Einfaches Beispiel

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

Das Paket nanoid nutzt dasselbe URL-sichere Alphabet und dieselbe Standardgröße wie das Werkzeug (21 Zeichen). Seine Funktion customAlphabet nimmt ein eigenes Alphabet und eine eigene Größe an.

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, kein Upload, bis zu 50 IDs pro Liste und alle Formatoptionen der drei Werkzeuge. Dafür gibt es keine Erzeugung mit hohem Durchsatz im Browser und keine monotone Reihenfolge über Listen, Tabs oder Prozesse hinweg. Ein eigenes Nanoid-Alphabet ist auf 256 Zeichen begrenzt. Nutzen Sie die Seiten, um ein Schema zu entwerfen oder Fixtures zu erzeugen. In Produktion gehören uuid, ulid und nanoid auf den Server.

Zusammenfassung

Kein Bezeichner passt für jeden Fall. UUID v4 bleibt die richtige Wahl für eine rein opake ID ohne Sortieranforderung, mit der breitesten nativen Unterstützung. UUID v7 oder ULID übernehmen, sobald die Einfügereihenfolge für die Indexleistung zählt oder eine Sortierung ohne eigene created_at-Spalte nötig ist. Nanoid liefert bei gegebener Entropie die kürzeste Zeichenkette, was in einer URL hilft. Keines der drei ersetzt eine serverseitige Autorisierungsprüfung. Für Erzeugung mit hohem Durchsatz im Browser ist auch keines gedacht, dafür gibt es die Server-Bibliotheken uuid, ulid und nanoid. Wandern diese IDs in der JSON-Nutzlast einer API, passt der Leitfaden zur Optimierung einer JSON-REST-API dazu. Der JSON-Schema-Validator prüft dann die erwartete Form eines id-Felds.

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: