CUID Generator

Generate collision-resistant unique IDs (CUID v1)

Anzahl

Generierte CUIDs

Klicken Sie auf Generieren, um CUIDs zu erstellen

CUID v1 ist ein Legacy-Format. Für neue Projekte CUID2 verwenden.

Was ist CUID?

CUID (Collision-Resistant Unique Identifier) ist ein Open-Source-Algorithmus zur Generierung eindeutiger IDs, die in verteilten Systemen ohne einen zentralen Koordinator gut funktionieren. Im Gegensatz zu einem einfachen UUID ist ein CUID so konzipiert, dass er horizontal skalierbar ist — mehrere Server oder Browser-Tabs können jeweils unabhängig IDs generieren, mit minimalem Kollisionsrisiko.

Jede CUID beginnt mit dem Kleinbuchstaben c, wodurch das Format auf den ersten Blick sofort erkennbar ist. Die verbleibenden Zeichen sind alle alphanumerische Kleinbuchstaben (base36), sodass eine CUID URL-sicher ist und direkt als URL-Pfadsegment oder Datenbankprimärschlüssel ohne zusätzliche Kodierung verwendet werden kann.

Die ursprüngliche CUID-Spezifikation (v1) wurde von Eric Elliott erstellt und über das npm-Paket cuid verbreitet. Sie wird nun von CUID v2 abgelöst, das kryptografische Sicherheit bietet. Diese Seite — und der obige Generator — erzeugt CUID v1-IDs, das klassische Format, das noch weit verbreitet in Produktions-Codebasen vorkommt.

CUID-Struktur

Eine CUID v1 ist etwa 25 Zeichen lang und besteht aus fünf verketteten Segmenten, die jeweils einen anderen Entropietyp tragen:

Beispiel: clrc4gkwz001ag2hs3k7f9m2q
cPräfixImmer der Buchstabe "c" — kennzeichnet eine CUID
lrc4gkwzZeitstempelMillisekunden-Zeitstempel in base36 (~8 Zeichen)
001aZähler4-stelliger base36-Zähler — verhindert Kollisionen im selben Millisekunden-Zeitfenster
g2hsFingerabdruck4-stelliger base36-Host-Fingerabdruck (Browser-/Umgebungsinfo)
3k7f9m2qZufällig8-stelliger base36-Zufallsblock — zwei 32-Bit-Werte

Die Segmente werden einfach verkettet — es gibt keine Trennzeichen. Die Gesamtlänge variiert leicht je nach aktuellem Zeitstempelwert, bleibt aber bei ungefähr 25 Zeichen.

Wie CUID Kollisionen Verhindert

Kollisionsresistenz entsteht durch das Überlagern unabhängiger Entropiequellen, sodass selbst in Worst-Case-Szenarien (Tausende von IDs pro Millisekunde über viele Maschinen) die Wahrscheinlichkeit zweier identischer IDs verschwindend gering bleibt.

Millisekunden-Zeitstempel
Das erste Segment kodiert die aktuelle Zeit in base36. IDs, die zu unterschiedlichen Zeitpunkten generiert werden, sortieren sich automatisch lexikografisch nach Erstellungszeit — nützlich für Paginierung und Debugging.
Monotoner Zähler
Innerhalb desselben Prozesses wird der 4-stellige Zähler bei jeder generierten ID erhöht. Selbst wenn zwei Aufrufe in derselben Millisekunde auf derselben Maschine stattfinden, garantiert der Zähler Eindeutigkeit für bis zu 65.536 IDs pro Millisekunde.
Maschinen-Fingerabdruck
Ein Hash, der aus umgebungsspezifischen Daten abgeleitet wird (Prozess-ID + Hostname in Node.js; Bildschirmabmessungen + Navigator-Info im Browser). Dies unterscheidet IDs, die auf separaten Hosts im selben Millisekunden-Zeitfenster mit demselben Zählerwert generiert werden.
Zufallsblock
Die letzten 8 Zeichen stammen aus zwei unabhängigen 32-Bit-Zufallswerten, die in base36 kodiert sind. Dies fügt eine letzte Entropieschicht hinzu, die gegen Kollisionen schützt, selbst wenn der Fingerabdruck zweier Maschinen zufällig denselben Wert ergibt.

CUID vs UUID v4

Sowohl CUID als auch UUID v4 werden häufig für die clientseitige ID-Generierung verwendet. Sie verfolgen unterschiedliche Ansätze für dasselbe Problem:

MerkmalCUID v1UUID v4
Formatc + base36 (~25 Zeichen)Hex-Gruppen (36 Zeichen mit Bindestrichen)
SortierbarUngefähr (Zeitstempel-Präfix)Nein
URL-sicherJa (nur alphanumerisch)Meistens (Bindestriche sind in URLs gültig)
KollisionsresistenzHoch — Zeitstempel + Zähler + Fingerabdruck + ZufallHoch — 122 Bits Zufall
VorhersagbarkeitTeilweise (Zeitstempel sichtbar)Keine (rein zufällig)
Länge~25 Zeichen36 Zeichen
Koordination erforderlichNeinNein

UUID v4 ist die sicherere Wahl für sicherheitssensible Szenarien, da es keine Zeitinformationen preisgibt. CUID hat den Vorteil, wenn Sie IDs wollen, die ungefähr sortierbar, kürzer und ohne Bindestriche sind — praktisch für die Verwendung in URLs, Dateinamen oder Logs, wo Sie schnell erkennen wollen, wann ein Datensatz erstellt wurde.

CUID v1 vs CUID2

Die CUID-Spezifikation wurde erheblich überarbeitet. Das Verständnis der Unterschiede hilft Ihnen, die richtige Version für Ihr Projekt zu wählen:

AspektCUID v1CUID v2
AlgorithmusDeterministische KomponentenSHA-3-basiert, vollständig opak
KryptografischNeinJa
Zeitstempel sichtbarJaNein
FormatBeginnt mit "c"Beginnt mit "c" (konfigurierbar)
npm-Paket@paralleldrive/cuid (veraltet)@paralleldrive/cuid2
Länge~25 Zeichen24 Zeichen (Standard, konfigurierbar)

Für neue Projekte ist CUID v2 die empfohlene Wahl. Die SHA-3-basierte Konstruktion bedeutet, dass die Ausgabe opak ist — kein Zeitstempel, Zähler oder Fingerabdruck kann aus der ID rückentwickelt werden. Verwenden Sie CUID v1 nur, wenn Sie Abwärtskompatibilität mit einem vorhandenen Datensatz benötigen oder eine abhängigkeitsfreie Implementierung wünschen.

Anwendungsfälle

Verteilte Datenbanken
Mehrere Datenbank-Shards oder Microservices können jeweils Primärschlüssel unabhängig generieren, ohne eine Sequenztabelle oder einen zentralen ID-Dienst, was einen einzelnen Ausfallpunkt eliminiert.
Clientseitige ID-Generierung
Ein Browser kann einem neuen Datensatz eine CUID zuweisen, bevor er an den Server gesendet wird, was optimistische UI-Aktualisierungen ermöglicht und den Hin- und Rückweg zum Abrufen einer serverseitig zugewiesenen ID eliminiert.
Offline-First-Apps
Mobile- oder PWA-Apps, die ohne Konnektivität betrieben werden, können Datensätze mit stabilen IDs erstellen, die die Synchronisation überleben — keine Konflikte, wenn das Gerät wieder online geht.
URL-Slugs
CUIDs enthalten nur alphanumerische Zeichen und sind daher sicher, direkt in URL-Pfade ohne prozentkodierung eingebettet zu werden. Das Zeitstempel-Präfix fügt eine grobe Erstellungszeit-Reihenfolge hinzu.
Ereignis- / Log-Korrelation
Da der Zeitstempel im ersten Segment kodiert ist, können Log-Einträge, die mit CUIDs gekennzeichnet sind, grob nach Erstellungszeit sortiert werden, auch über verteilte Log-Aggregatoren hinweg.
ORM / Prisma-Standard
Prisma verwendet CUID als Standard-@id-Strategie für String-Primärschlüssel — @default(cuid()) — was es zu einem der am weitesten verbreiteten ID-Formate im JavaScript-Ökosystem macht.

Code-Beispiele

Installieren Sie das offizielle CUID v2-Paket (empfohlen) oder schreiben Sie eine minimale v1-Implementierung ohne Abhängigkeiten:

JavaScript / TypeScript
// npm install @paralleldrive/cuid2  (recommended — CUID v2)
import { createId } from '@paralleldrive/cuid2'

const id = createId()
// → 'tz4a98xxat96iws9zmbrgj3a'

// Custom length
import { init } from '@paralleldrive/cuid2'
const createShortId = init({ length: 10 })
createShortId() // → 'zxp1l6mf4c'

Wenn Sie eine abhängigkeitsfreie Node.js-Implementierung des v1-Algorithmus bevorzugen:

Node.js (no dependencies)
// Pure Node.js — CUID v1 style (no dependencies)
let counter = 0

function pad(str, size) {
  return str.padStart(size, '0').slice(-size)
}

function fingerprint() {
  const os = require('os')
  const source = [process.pid, os.hostname().length].join('')
  let hash = 0
  for (const c of source) {
    hash = ((hash << 5) - hash) + c.charCodeAt(0)
    hash |= 0
  }
  return pad(Math.abs(hash).toString(36), 4)
}

function cuid() {
  const timestamp = Date.now().toString(36)
  const cnt       = pad((counter++ & 0xffff).toString(36), 4)
  const fp        = fingerprint()
  const rnd       = pad(Math.floor(Math.random() * 0xffffffff).toString(36), 4)
              + pad(Math.floor(Math.random() * 0xffffffff).toString(36), 4)
  return 'c' + timestamp + cnt + fp + rnd
}

console.log(cuid()) // → 'clrc4gkwz001ag2hs3k7f9m2q'

Verwendung von CUID als Datenbankprimärschlüssel mit Prisma und PostgreSQL:

Prisma / SQL
-- Use CUID as a primary key in PostgreSQL
CREATE TABLE users (
  id   TEXT        PRIMARY KEY DEFAULT gen_cuid(),
  name TEXT        NOT NULL,
  created_at TIMESTAMPTZ DEFAULT now()
);

-- Prisma schema (auto-generates CUID by default)
model User {
  id        String   @id @default(cuid())
  name      String
  createdAt DateTime @default(now())
}

Häufig gestellte Fragen

Ist CUID URL-sicher?
Ja. CUID v1 verwendet nur Kleinbuchstaben und Ziffern (base36-Kodierung), die alle URL-sichere Zeichen sind. Bei der Verwendung einer CUID in einem URL-Pfad oder Abfrageparameter ist keine Prozentkodierung erforderlich.
Ist CUID kryptografisch sicher?
Nein. CUID v1 verwendet Math.random() und legt ein sichtbares Zeitstempel-Präfix offen. Es ist nicht für sicherheitssensible Zwecke wie Sitzungstoken oder Passwort-Reset-Links geeignet. Verwenden Sie für diese Anwendungsfälle crypto.randomUUID() oder CUID v2.
CUID vs NanoID — welches soll ich wählen?
NanoID ist kryptografisch sicher, kürzer (standardmäßig 21 Zeichen) und verwendet ein anpassbares Alphabet. Wählen Sie NanoID, wenn Sicherheit wichtig ist oder wenn Sie eine kürzere ID benötigen. Wählen Sie CUID, wenn Sie eine grob sortierbare, zeitstempelpräfixierte ID wünschen, die für Menschen debuggbar ist.
Soll ich CUID v1 oder CUID v2 verwenden?
CUID v2 ist die aktuelle Empfehlung. Es ist kryptografisch sicher, gibt keine Zeitinformationen preis und wird aktiv gepflegt. CUID v1 ist nützlich, wenn Sie eine einfache abhängigkeitsfreie Implementierung benötigen oder ein Legacy-System pflegen. Dieser Generator erzeugt CUID v1-IDs.
CUID vs ULID — was ist der Unterschied?
Beide haben Zeitstempel-Präfix und sind lexikografisch sortierbar. ULID verwendet Crockford base32 (insgesamt 128 Bits, 48-Bit-Zeitstempel + 80-Bit-Zufall), was es etwas zufälliger macht. CUID fügt einen Maschinen-Fingerabdruck und einen monotonen Zähler hinzu, was die Kollisionsresistenz auf demselben Host innerhalb derselben Millisekunde verbessert. ULID sortiert zuverlässiger, da der Zeitstempel den vollständigen höherwertigen Teil belegt.
Ist CUID garantiert eindeutig?
Kein ID-Schema kann ohne einen zentralen Koordinator eine mathematische Garantie geben. CUID macht Kollisionen durch die Kombination von vier unabhängigen Entropiequellen extrem unwahrscheinlich: dem Zeitstempel, einem prozessbezogenen Zähler, einem Maschinen-Fingerabdruck und Zufallsdaten. In der Praxis sind Kollisionen weit unwahrscheinlicher als Hardwareausfälle.