ToolDeck

CUID2 Generator

Generate secure next-generation CUID2 identifiers

Count
Length

Generated CUID2s

Click Generate to create CUID2s

Vad är CUID2?

CUID2 (Collision-resistant Unique ID, version 2) är efterföljaren till CUID v1, utformat för att generera korta, kryptografiskt säkra och ogenomskinliga ID:n som är säkra att använda som primärnycklar i databaser, URL:er och distribuerade system.

Till skillnad från sin föregångare avslöjar CUID2 ingen information om skapandetiden, värdmaskinen eller processen som genererade det. Varje ID är en till synes slumpmässig sträng som börjar med en slumpmässig gemen bokstav följt av en base-36-hash härledd från SHA-512. Standardlängden är 24 tecken, men du kan konfigurera den från 2 till 32 tecken för att passa dina lagringskrav.

CUID2 rekommenderas brett av moderna databasverktyg. Prisma antog det som standard-ID-strategi för sin @default(cuid())-skalär, och PlanetScale, Neon och andra serverlösa databasleverantörer listar uttryckligen CUID2 som ett föredraget ID-format eftersom det undviker de sekventiella sårbarheterna hos auto-increment-heltal medan det är kortare och mer läsbart än ett UUID.

Varför CUID2 ersatte CUID v1

CUID v1, lanserat 2012 av Eric Elliott, var en stor förbättring jämfört med vanliga UUID:er för ID-generering på klientsidan. Säkerhetsforskare upptäckte dock två grundläggande problem med dess design:

  • Fingeravtryckning: Värdfingeravtrycket inbäddat i varje CUID v1-värde kunde användas för att identifiera den maskin eller process som genererade ID:t, vilket läckte operativ metadata till alla som kunde observera ID:na.
  • Förutsägbarhet: Eftersom CUID v1 innehöll en monotont ökande räknare och ett tidsstämpelsegment, kunde en angripare som observerade flera ID:n förutsäga det ungefärliga intervallet för framtida ID:n, vilket möjliggjorde uppräkningsattacker mot API:er som använder ID:n som enda autentiseringskontroll.
  • Icke-kryptografisk hash: CUID v1 använde ett enkelt icke-kryptografiskt hashsteg som inte uppfyllde moderna säkerhetsstandarder.

Eric Elliott, den ursprungliga författaren, föråldrade formellt CUID v1 och skapade CUID2 från grunden för att åtgärda alla dessa problem. Den nya algoritmen använder Web Crypto API (SHA-512) och eliminerar alla deterministiska komponenter, vilket gör varje ID statistiskt oberoende av alla andra.

CUID2:s designprinciper

Oförutsägbar
Ingen tidsstämpel, räknare eller värdfingeravtryck bäddas in. Varje ID genereras från ett nytt kryptografiskt slumpsalt kombinerat med SHA-512.
Jämn fördelning
Base-36-kodning av SHA-512-digestet ger nära enhetlig teckendistribution, vilket minskar indexhottspots i B-träddatabaser.
URL-säker som standard
Alfabetet är begränsat till gemena a–z och siffrorna 0–9 — inga bindestreck, understreck eller blandad stil — vilket gör ID:n säkra i URL:er utan procentkodning.
Konfigurerbar längd
Du väljer längden (2–32). Kortare ID:n ger högre kollisionssannolikhet; det rekommenderade standardvärdet 24 ger ~4 × 10³⁷ unika värden.
Börjar alltid med en bokstav
Det första tecknet är alltid en slumpmässig gemen bokstav, vilket säkerställer att CUID2-värden är giltiga HTML-element-ID:n och CSS-selektorer utan escapning.
Ingen server krävs
CUID2 förlitar sig enbart på Web Crypto API som finns i alla moderna webbläsare och Node.js 15+, så ID:n kan genereras på klienten med samma säkerhetsgarantier som servern.

CUID2 vs CUID v1 — jämförelse

Tabellen nedan sammanfattar de viktigaste skillnaderna mellan CUID2 och det nu föråldrade CUID v1. Om du för närvarande använder CUID v1 rekommenderas starkt att migrera till CUID2.

AttributCUID2CUID v1
SäkerhetKryptografisk (SHA-512)Icke-kryptografisk (fingeravtrycksbaserad)
FörutsägbarhetOgenomskinlig — ingen metadata läckerTidsstämpel + fingeravtryck synliga i ID
LängdKonfigurerbar (2–32 tecken)Fast 25 tecken
PrefixSlumpmässig a–z-bokstavBörjar alltid med "c"
DistributionJämn / enhetligMonotont ökande segment
StatusAktivt underhålletFöråldrat av ursprunglig författare

CUID2 vs UUID v4 — jämförelse

UUID v4 är den dominerande standarden för slumpmässiga unika ID:n. CUID2 erbjuder flera praktiska fördelar jämfört med UUID v4 utan att kompromissa med säkerheten.

AttributCUID2UUID v4
Standardlängd24 tecken36 tecken (med bindestreck)
URL-säkerJa — gemena a–z + 0–9Kräver kodning (innehåller bindestreck)
Anpassad längdJa (2–32)Nej — alltid 128 bitar / 36 tecken
SorterbarNej (med avsikt)Nej (v4 är slumpmässig)
EntropikällaSHA-512 + Web CryptoCSPRNG
TeckenuppsättningBase-36 (a–z, 0–9)Hex + bindestreck

Den huvudsakliga avvägningen är igenkänning: UUID v4 är en IETF-standard (RFC 4122) som stöds av praktiskt taget varje databas, programmeringsspråk och API-ramverk direkt. CUID2 är en community-standard med växande men inte universellt stöd. Välj UUID v4 när interoperabilitet med externa system är avgörande; välj CUID2 när du kontrollerar båda ändarna och föredrar kortare, URL-säkra ID:n.

Vem använder CUID2

CUID2 har fått snabb spridning i JavaScript- och TypeScript-ekosystemet:

  • Prisma — det mest populära TypeScript-ORM:et använder CUID2 som rekommenderat standard för @id-fält med @default(cuid()) i Prisma Schema v2+.
  • PlanetScale — deras dokumentation och startmallar rekommenderar CUID2 för applikationsgenererade primärnycklar för att undvika prestandaproblem vid sekventiell genomsökning på deras distribuerade MySQL-plattform.
  • Drizzle ORM — tillhandahåller en inbyggd cuid2()-standardhjälp för kolumndefinitioner.
  • tRPC-boilerplates — många community-mallar för tRPC + Prisma levereras med CUID2 som primärnyckels-strategi.
  • T3 Stack — create-t3-app-scaffolding-verktyget använder Prisma med CUID2-standardvärden i genererade schemafiler.

Kodexempel

Det officiella npm-paketet @paralleldrive/cuid2 har ett enkelt 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"

Använda CUID2 med Prisma-schema:

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

Generera CUID2 i Node.js utan npm-paketet (enbart med Web Crypto API, som det här verktyget gör i webbläsaren):

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"

Vanliga frågor

Är CUID2 bakåtkompatibelt med CUID v1?
Nej. CUID2-ID:n ser helt annorlunda ut än CUID v1-ID:n. CUID v1 börjar alltid med bokstaven "c" och har en fast längd på 25 tecken. CUID2 börjar med en slumpmässig bokstav och har en konfigurerbar längd (standard 24). Om du migrerar en befintlig databas behöver du hantera båda formaten eller köra en migrering för att ersätta alla CUID v1-värden.
Vilken längd ska jag använda?
Standardvärdet på 24 tecken är det rekommenderade valet för de flesta applikationer. Det ger ungefär 4 × 10³⁷ unika värden, vilket gör kollisioner statistiskt omöjliga även i stor skala. Använd 16 tecken om lagring är kritiskt och din datamängd är under några miljarder poster. Använd 32 tecken för den maximala säkerhetsmarginalen.
Är CUID2 sorterbart efter skapelsetid?
Nej — och detta är avsiktligt. CUID2 kastar medvetet bort all tidsinformation för att förhindra uppräkningsattacker och fingeravtryckning. Om du behöver tidsorienterade ID:n, överväg ULID eller UUID v7 istället. CUID2 byter sorterbarhet mot säkerhet och ogenomskinlighet.
CUID2 vs NanoID — vilket ska jag välja?
Båda är säkra och URL-säkra. NanoID är något kortare med 21 tecken som standard och använder ett större alfabet (A–Za–z0–9_-) som ger mer entropi per tecken. CUID2 använder ett begränsat alfabet (a–z, 0–9) som är säkrare i CSS-selektorer och börjar alltid med en bokstav. Välj NanoID om du vill ha maximal entropitäthet; välj CUID2 om Prisma/ORM-integration eller CSS-säkra ID:n är viktigt.
Är CUID2 URL-säkert?
Ja. CUID2 använder bara gemena bokstäver (a–z) och siffror (0–9). Det innehåller inga bindestreck, understreck, plustecken, snedstreck eller likhetstecken, så det kan bäddas in direkt i URL:er, HTML-id-attribut, CSS-selektorer och filnamn utan någon kodning.
Kan jag använda CUID2 som databasprimärnyckel?
Ja, och det är ett av de primära användningsfallen. CUID2 undviker det sekventiella mönstret hos auto-increment-heltal (som kan läcka radantal och möjliggöra uppräkning), är kortare än ett UUID (sparar indexutrymme) och är URL-säkert. De flesta databaser lagrar det som en VARCHAR(24)- eller TEXT-kolumn. Observera att till skillnad från ULID:er eller UUID v7 är CUID2-värden inte tidsorienterade, så om dina frågor är starkt beroende av insättningsordningsgenomsökningar kan du föredra ett sorterbart alternativ.