CUID2 Generator

Generate secure next-generation CUID2 identifiers

Anzahl
Länge

Generierte CUID2s

Klicken Sie auf Generieren, um CUID2s zu erstellen

Was ist CUID2?

CUID2 (Collision-resistant Unique ID, Version 2) ist der Nachfolger der nächsten Generation von CUID v1, der entwickelt wurde, um kurze, kryptografisch sichere, opake IDs zu generieren, die als Primärschlüssel in Datenbanken, URLs und verteilten Systemen sicher verwendet werden können.

Im Gegensatz zu seinem Vorgänger verrät CUID2 keine Informationen über den Erstellungszeitpunkt, die Host-Maschine oder den Prozess, der es generiert hat. Jede ID ist eine scheinbar zufällige Zeichenfolge, die mit einem zufälligen Kleinbuchstaben beginnt, gefolgt von einem base-36-Hash aus SHA-512. Die Standardlänge beträgt 24 Zeichen, kann aber von 2 bis 32 Zeichen konfiguriert werden.

CUID2 wird von modernen Datenbank-Toolkits weitgehend empfohlen. Prisma hat es als Standard-ID-Strategie für seinen @default(cuid())-Skalar übernommen, und PlanetScale, Neon sowie andere serverlose Datenbankprovider listen CUID2 explizit als bevorzugtes ID-Format auf.

Warum CUID2 CUID v1 Ersetzt Hat

CUID v1, das 2012 von Eric Elliott veröffentlicht wurde, war eine wichtige Verbesserung gegenüber einfachen UUIDs für die clientseitige ID-Generierung. Sicherheitsforscher entdeckten jedoch zwei grundlegende Probleme mit seinem Design:

  • Fingerprinting: Der in jeden CUID v1-Wert eingebettete Host-Fingerabdruck konnte verwendet werden, um die Maschine oder den Prozess zu identifizieren, der die ID generiert hat, was operative Metadaten an jeden preisgab, der die IDs beobachten konnte.
  • Vorhersagbarkeit: Da CUID v1 einen monoton steigenden Zähler und ein Zeitstempel-Segment enthielt, konnte ein Angreifer, der mehrere IDs beobachtete, den ungefähren Bereich zukünftiger IDs vorhersagen, was Enumerationsangriffe gegen APIs ermöglicht, die IDs als einzige Autorisierungsprüfung verwenden.
  • Nicht-kryptografischer Hash: CUID v1 verwendete einen einfachen nicht-kryptografischen Hash-Schritt, der modernen Sicherheitsstandards nicht entsprach.

Eric Elliott, der ursprüngliche Autor, hat CUID v1 formal als veraltet erklärt und CUID2 von Grund auf neu entwickelt, um all diese Probleme zu beheben. Der neue Algorithmus verwendet die Web Crypto API (SHA-512) und eliminiert alle deterministischen Komponenten.

CUID2 Design-Prinzipien

Unvorhersehbar
Kein Zeitstempel, Zähler oder Host-Fingerabdruck wird eingebettet. Jede ID wird aus einem neuen kryptografischen Zufallssalz kombiniert mit SHA-512 generiert.
Gleichmäßige Verteilung
Die base-36-Kodierung des SHA-512-Digests erzeugt eine nahezu gleichmäßige Zeichenverteilung, die Indexierungs-Hotspots in B-Baum-Datenbanken reduziert.
Standardmäßig URL-sicher
Das Alphabet ist auf Kleinbuchstaben a–z und Ziffern 0–9 beschränkt — keine Bindestriche, Unterstriche oder Großbuchstaben — was IDs in URLs ohne Prozentkodierung sicher macht.
Konfigurierbare Länge
Sie wählen die Länge (2–32). Kürzere IDs bedeuten höhere Kollisionswahrscheinlichkeit; der empfohlene Standard von 24 gibt ~4 × 10³⁷ eindeutige Werte.
Beginnt immer mit einem Buchstaben
Das erste Zeichen ist immer ein zufälliger Kleinbuchstabe, was sicherstellt, dass CUID2-Werte gültige HTML-Element-IDs und CSS-Selektoren ohne Escaping sind.
Kein Server erforderlich
CUID2 basiert ausschließlich auf der Web Crypto API, die in allen modernen Browsern und Node.js 15+ verfügbar ist, sodass IDs clientseitig mit denselben Sicherheitsgarantien wie serverseitig generiert werden können.

CUID2 vs CUID v1 — Vergleich

Die folgende Tabelle fasst die wichtigsten Unterschiede zwischen CUID2 und dem nun veralteten CUID v1 zusammen. Wenn Sie derzeit CUID v1 verwenden, wird die Migration zu CUID2 dringend empfohlen.

AttributCUID2CUID v1
SicherheitKryptografisch (SHA-512)Nicht-kryptografisch (fingerabdruckbasiert)
VorhersagbarkeitOpak — keine Metadaten preisgegebenZeitstempel + Fingerabdruck in ID sichtbar
LängeKonfigurierbar (2–32 Zeichen)Fest 25 Zeichen
PräfixZufälliger Buchstabe a–zBeginnt immer mit "c"
VerteilungFlach / gleichmäßigMonoton steigende Segmente
StatusAktiv gepflegtVom ursprünglichen Autor als veraltet markiert

CUID2 vs UUID v4 — Vergleich

UUID v4 ist der dominierende Standard für zufällige eindeutige IDs. CUID2 bietet gegenüber UUID v4 mehrere praktische Vorteile ohne Sicherheitseinbußen.

AttributCUID2UUID v4
Standardlänge24 Zeichen36 Zeichen (mit Bindestrichen)
URL-sicherJa — Kleinbuchstaben a–z + 0–9Erfordert Kodierung (enthält Bindestriche)
Benutzerdefinierte LängeJa (2–32)Nein — immer 128 Bits / 36 Zeichen
SortierbarNein (by design)Nein (v4 ist zufällig)
EntropiequelleSHA-512 + Web CryptoCSPRNG
ZeichensatzBase-36 (a–z, 0–9)Hex + Bindestriche

Der wichtigste Kompromiss ist die Vertrautheit: UUID v4 ist ein IETF-Standard (RFC 4122), der von nahezu jeder Datenbank, Programmiersprache und jedem API-Framework unterstützt wird. CUID2 ist ein Community-Standard mit wachsender, aber nicht universeller Unterstützung. Wählen Sie UUID v4, wenn Interoperabilität mit externen Systemen entscheidend ist; wählen Sie CUID2, wenn Sie beide Seiten kontrollieren und kürzere, URL-sichere IDs bevorzugen.

Wer Verwendet CUID2

CUID2 hat im modernen JavaScript- und TypeScript-Ökosystem schnell an Verbreitung gewonnen:

  • Prisma — das beliebteste TypeScript ORM verwendet CUID2 als empfohlenen Standard für @id-Felder mit @default(cuid()) in Prisma Schema v2+.
  • PlanetScale — ihre Dokumentation und Starter-Vorlagen empfehlen CUID2 für anwendungsgenerierte Primärschlüssel, um sequentielle Scan-Performance-Probleme auf ihrer verteilten MySQL-Plattform zu vermeiden.
  • Drizzle ORM — bietet einen eingebauten Standard-Helper cuid2() für Spaltendefinitionen.
  • tRPC-Boilerplates — viele Community-tRPC + Prisma-Starter-Vorlagen werden mit CUID2 als Primärschlüssel-Strategie geliefert.
  • T3 Stack — das create-t3-app-Scaffolding-Tool verwendet Prisma mit CUID2-Standards in generierten Schema-Dateien.

Code-Beispiele

Das offizielle npm-Paket @paralleldrive/cuid2 bietet eine einfache API:

JavaScript (npm — @paralleldrive/cuid2)
import { createId } from '@paralleldrive/cuid2'

// Generate a single CUID2 (default length: 24)
const id = createId()
console.log(id) // e.g. "tz4a98xxat96iws9zmbrgj3a"

// Custom length
import { init } from '@paralleldrive/cuid2'
const createShortId = init({ length: 16 })
const shortId = createShortId()
console.log(shortId) // e.g. "tz4a98xxat96iws9"

Verwendung von CUID2 mit dem Prisma-Schema:

Prisma Schema
model User {
  id        String   @id @default(cuid())
  email     String   @unique
  name      String?
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

Generierung von CUID2 in Node.js ohne das npm-Paket (nur mit der Web Crypto API, wie dieses Tool im Browser):

Node.js (Web Crypto — no dependencies)
async function generateCuid2(length = 24) {
  const alphabet = 'abcdefghijklmnopqrstuvwxyz'

  // Random prefix letter
  const firstByte = crypto.getRandomValues(new Uint8Array(1))[0]
  const firstChar = alphabet[firstByte % 26]

  // Random 32-byte salt
  const salt = crypto.getRandomValues(new Uint8Array(32))
  const saltHex = [...salt].map(b => b.toString(16).padStart(2, '0')).join('')

  // SHA-512 of timestamp + salt
  const input = Date.now().toString(36) + saltHex
  const hashBuffer = await crypto.subtle.digest(
    'SHA-512',
    new TextEncoder().encode(input)
  )

  // Encode hash bytes as base-36 string
  const bytes = new Uint8Array(hashBuffer)
  let hash = ''
  for (let i = 0; i < bytes.length; i += 8) {
    let chunk = 0n
    for (let j = 0; j < 8 && i + j < bytes.length; j++) {
      chunk = (chunk << 8n) | BigInt(bytes[i + j])
    }
    hash += chunk.toString(36)
  }

  return (firstChar + hash).slice(0, length)
}

// Usage
const id = await generateCuid2()
console.log(id) // e.g. "m7k3r9p2nxq8zt5a6cwj4bvd"

Häufig gestellte Fragen

Ist CUID2 abwärtskompatibel mit CUID v1?
Nein. CUID2-IDs sehen völlig anders aus als CUID v1-IDs. CUID v1 beginnt immer mit dem Buchstaben "c" und hat eine feste Länge von 25 Zeichen. CUID2 beginnt mit einem zufälligen Buchstaben und hat eine konfigurierbare Länge (Standard 24). Bei der Migration einer vorhandenen Datenbank müssen Sie beide Formate verwalten oder eine Migration durchführen, um alle CUID v1-Werte zu ersetzen.
Welche Länge soll ich verwenden?
Der Standard von 24 Zeichen ist die empfohlene Wahl für die meisten Anwendungen. Er bietet ungefähr 4 × 10³⁷ eindeutige Werte, was Kollisionen selbst bei massivem Maßstab statistisch unmöglich macht. Verwenden Sie 16 Zeichen, wenn Speicherplatz kritisch ist und Ihr Datensatz unter einigen Milliarden Datensätzen liegt. Verwenden Sie 32 Zeichen für die maximale Sicherheitsmarge.
Ist CUID2 nach Erstellungszeit sortierbar?
Nein — und das ist beabsichtigt. CUID2 verwirft absichtlich alle zeitlichen Informationen, um Enumerationsangriffe und Fingerprinting zu verhindern. Wenn Sie zeitgeordnete IDs benötigen, ziehen Sie stattdessen ULID oder UUID v7 in Betracht. CUID2 tauscht Sortierbarkeit gegen Sicherheit und Opazität.
CUID2 vs NanoID — welches soll ich wählen?
Beide sind sicher und URL-sicher. NanoID ist mit standardmäßig 21 Zeichen etwas kürzer und verwendet ein größeres Alphabet (A–Za–z0–9_-), was mehr Entropie pro Zeichen bietet. CUID2 verwendet ein eingeschränktes Alphabet (a–z, 0–9), das in CSS-Selektoren sicherer ist und beginnt immer mit einem Buchstaben. Wählen Sie NanoID für maximale Entropiedichte; wählen Sie CUID2, wenn Prisma/ORM-Integration oder CSS-sichere IDs wichtig sind.
Ist CUID2 URL-sicher?
Ja. CUID2 verwendet nur Kleinbuchstaben (a–z) und Ziffern (0–9). Es enthält keine Bindestriche, Unterstriche, Pluszeichen, Schrägstriche oder Gleichheitszeichen, sodass es direkt in URLs, HTML-id-Attribute, CSS-Selektoren und Dateinamen ohne Kodierung eingebettet werden kann.
Kann ich CUID2 als Datenbankprimärschlüssel verwenden?
Ja, und es ist einer der primären Anwendungsfälle. CUID2 vermeidet das sequentielle Muster von Auto-Inkrement-Ganzzahlen (die Zeilenanzahlen preisgeben und Enumeration ermöglichen können), ist kürzer als eine UUID (spart Indexspeicher) und ist URL-sicher. Die meisten Datenbanken speichern es als VARCHAR(24) oder TEXT-Spalte. Beachten Sie, dass CUID2-Werte im Gegensatz zu ULIDs oder UUID v7 nicht zeitgeordnet sind, sodass Sie bei Abfragen, die stark auf Einfügereihenfolge-Scans angewiesen sind, eine sortierbare Alternative bevorzugen könnten.