Generatore CUID2

Genera identificatori CUID2 sicuri di nuova generazione

Quantità
Lunghezza

CUID2 generati

Clicca su Genera per creare CUID2

Cos'è CUID2?

CUID2 (Collision-resistant Unique ID, versione 2) è il successore di nuova generazione di CUID v1, progettato per generare ID brevi, crittograficamente sicuri e opachi che sono sicuri da usare come chiavi primarie in database, URL e sistemi distribuiti.

A differenza del suo predecessore, CUID2 non rivela alcuna informazione sul momento della creazione, la macchina host o il processo che l'ha generato. Ogni ID è una stringa apparentemente casuale che inizia con una lettera minuscola casuale seguita da un hash base-36 derivato da SHA-512. La lunghezza predefinita è 24 caratteri, ma puoi configurarla da 2 a 32 caratteri in base alle tue esigenze di archiviazione.

CUID2 è ampiamente raccomandato dai toolkit di database moderni. Prisma lo ha adottato come strategia ID predefinita per il suo scalare @default(cuid()), e PlanetScale, Neon e altri provider di database serverless elencano esplicitamente CUID2 come formato ID preferito.

Perché CUID2 Ha Sostituito CUID v1

CUID v1, rilasciato nel 2012 da Eric Elliott, era un importante miglioramento rispetto agli UUID semplici per la generazione di ID lato client. Tuttavia, i ricercatori di sicurezza hanno scoperto due problemi fondamentali nel suo design:

  • Fingerprinting: L'impronta digitale dell'host incorporata in ogni valore CUID v1 poteva essere usata per identificare la macchina o il processo che ha generato l'ID, rivelando metadati operativi a chiunque potesse osservare gli ID.
  • Prevedibilità: Poiché CUID v1 incorporava un contatore monotonicamente crescente e un segmento timestamp, un attaccante che osservava diversi ID poteva prevedere l'intervallo approssimativo dei futuri ID, abilitando attacchi di enumerazione contro API che usano gli ID come unico controllo di autorizzazione.
  • Hash non crittografico: CUID v1 usava un semplice passaggio di hash non crittografico che non soddisfaceva gli standard di sicurezza moderni.

Eric Elliott, l'autore originale, ha formalmente deprecato CUID v1 e creato CUID2 da zero per risolvere tutti questi problemi. Il nuovo algoritmo usa la Web Crypto API (SHA-512) ed elimina tutti i componenti deterministici.

Principi di Design di CUID2

Imprevedibile
Nessun timestamp, contatore o impronta digitale dell'host viene incorporato. Ogni ID viene generato da un nuovo sale casuale crittografico combinato con SHA-512.
Distribuzione piatta
La codifica base-36 del digest SHA-512 produce una distribuzione di caratteri quasi uniforme, riducendo i punti caldi di indicizzazione nei database B-tree.
Sicuro per URL per default
L'alfabeto è limitato a lettere minuscole a–z e cifre 0–9 — nessun trattino, underscore o maiuscole — rendendo gli ID sicuri negli URL senza codifica percentuale.
Lunghezza configurabile
Scegli la lunghezza (2–32). ID più corti significano maggiore probabilità di collisione; il valore predefinito raccomandato di 24 dà ~4 × 10³⁷ valori unici.
Inizia sempre con una lettera
Il primo carattere è sempre una lettera minuscola casuale, garantendo che i valori CUID2 siano ID di elementi HTML e selettori CSS validi senza escaping.
Nessun server richiesto
CUID2 si basa esclusivamente sulla Web Crypto API disponibile in tutti i browser moderni e Node.js 15+, quindi gli ID possono essere generati lato client con le stesse garanzie di sicurezza del server.

CUID2 vs CUID v1 — Confronto

La tabella seguente riassume le differenze chiave tra CUID2 e il now deprecato CUID v1. Se stai attualmente usando CUID v1, è fortemente raccomandato migrare a CUID2.

AttributoCUID2CUID v1
SicurezzaCrittografico (SHA-512)Non crittografico (basato su impronta digitale)
PrevedibilitàOpaco — nessun metadato rivelatoTimestamp + impronta digitale visibili nell'ID
LunghezzaConfigurabile (2–32 chars)Fisso 25 chars
PrefissoLettera casuale a–zInizia sempre con "c"
DistribuzionePiatta / uniformeSegmenti monotonicamente crescenti
StatoAttivamente mantenutoDeprecato dall'autore originale

CUID2 vs UUID v4 — Confronto

UUID v4 è lo standard dominante per ID unici casuali. CUID2 offre diversi vantaggi pratici rispetto a UUID v4 senza sacrificare la sicurezza.

AttributoCUID2UUID v4
Lunghezza predefinita24 caratteri36 caratteri (con trattini)
Sicuro per URLSì — minuscole a–z + 0–9Richiede codifica (contiene trattini)
Lunghezza personalizzataSì (2–32)No — sempre 128 bit / 36 chars
OrdinabileNo (by design)No (v4 è casuale)
Fonte di entropiaSHA-512 + Web CryptoCSPRNG
Set di caratteriBase-36 (a–z, 0–9)Hex + trattini

Il principale compromesso è la familiarità: UUID v4 è uno standard IETF (RFC 4122) riconosciuto da praticamente ogni database, linguaggio di programmazione e framework API. CUID2 è uno standard della comunità con supporto crescente ma non universale. Scegli UUID v4 quando l'interoperabilità con sistemi esterni è fondamentale; scegli CUID2 quando controlli entrambe le estremità e preferisci ID più corti e sicuri per URL.

Chi Usa CUID2

CUID2 ha visto una rapida adozione nell'ecosistema moderno di JavaScript e TypeScript:

  • Prisma — il più popolare TypeScript ORM usa CUID2 come predefinito raccomandato per i campi @id con @default(cuid()) in Prisma Schema v2+.
  • PlanetScale — la loro documentazione e i modelli di avvio raccomandano CUID2 per le chiavi primarie generate dall'applicazione per evitare problemi di performance di scansione sequenziale sulla loro piattaforma MySQL distribuita.
  • Drizzle ORM — fornisce un helper predefinito integrato cuid2() per le definizioni di colonne.
  • Boilerplate tRPC — molti template comunitari tRPC + Prisma vengono forniti con CUID2 come strategia di chiave primaria.
  • T3 Stack — lo strumento di scaffolding create-t3-app usa Prisma con valori predefiniti CUID2 nei file di schema generati.

Esempi di Codice

Il pacchetto npm ufficiale @paralleldrive/cuid2 fornisce una semplice 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"

Usando CUID2 con lo schema Prisma:

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

Generare CUID2 in Node.js senza il pacchetto npm (usando solo la Web Crypto API, come fa questo strumento nel 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"

Domande Frequenti

CUID2 è compatibile con le versioni precedenti di CUID v1?
No. Gli ID CUID2 sembrano completamente diversi dagli ID CUID v1. CUID v1 inizia sempre con la lettera "c" e ha una lunghezza fissa di 25 caratteri. CUID2 inizia con una lettera casuale e ha una lunghezza configurabile (24 per default). Se si migra un database esistente, sarà necessario gestire entrambi i formati o eseguire una migrazione per sostituire tutti i valori CUID v1.
Quale lunghezza devo usare?
Il default di 24 caratteri è la scelta raccomandata per la maggior parte delle applicazioni. Fornisce circa 4 × 10³⁷ valori unici, rendendo le collisioni statisticamente impossibili anche su scala massiccia. Usa 16 caratteri se lo storage è critico e il tuo dataset è sotto qualche miliardo di record. Usa 32 caratteri per il massimo margine di sicurezza.
CUID2 è ordinabile per tempo di creazione?
No — e questo è intenzionale. CUID2 scarta deliberatamente tutte le informazioni temporali per prevenire attacchi di enumerazione e fingerprinting. Se hai bisogno di ID ordinati nel tempo, considera ULID o UUID v7 invece. CUID2 scambia l'ordinabilità per sicurezza e opacità.
CUID2 vs NanoID — quale scegliere?
Entrambi sono sicuri e sicuri per URL. NanoID è leggermente più corto con 21 caratteri per default e usa un alfabeto più grande (A–Za–z0–9_-) che dà più entropia per carattere. CUID2 usa un alfabeto ristretto (a–z, 0–9) che è più sicuro nei selettori CSS e inizia sempre con una lettera. Scegli NanoID se vuoi la massima densità di entropia; scegli CUID2 se l'integrazione Prisma/ORM o gli ID sicuri per CSS sono importanti.
CUID2 è sicuro per gli URL?
Sì. CUID2 usa solo lettere minuscole (a–z) e cifre (0–9). Non contiene trattini, underscore, segni più, barre o segni di uguale, quindi può essere incorporato direttamente in URL, attributi id HTML, selettori CSS e nomi di file senza alcuna codifica.
Posso usare CUID2 come chiave primaria del database?
Sì, ed è uno dei casi d'uso principali. CUID2 evita il pattern sequenziale degli interi auto-incrementali (che possono rivelare conteggi di righe e abilitare l'enumerazione), è più corto di un UUID (risparmiando spazio negli indici) e è sicuro per URL. La maggior parte dei database lo memorizza come colonna VARCHAR(24) o TEXT. Nota che a differenza di ULID o UUID v7, i valori CUID2 non sono ordinati nel tempo, quindi se le tue query dipendono molto dalle scansioni nell'ordine di inserimento, potresti preferire un'alternativa ordinabile.