CUID2 Generator

Generate secure next-generation CUID2 identifiers

Počet
Délka

Vygenerovaná CUID2

Klikněte na Generovat pro vytvoření CUID2

Co je CUID2?

CUID2 je druhá generace CUID, přepsaná od základů se zaměřením na kryptografickou bezpečnost a soukromí.

Na rozdíl od CUID v1, který viditelně vkládá časové razítko, CUID2 skrývá všechny komponenty uvnitř SHA3 hashe, čímž vytváří prakticky nepředvídatelné řetězce.

ID začíná přizpůsobitelným abecedním prefixem (výchozí c) následovaným base36 řetězcem SHA3 hashe.

Proč CUID2?

CUID2 vznikl jako odpověď na konkrétní bezpečnostní obavy v CUID v1:

  • Odhalené časové razítko: CUID v1 odhaloval čas vytvoření na začátku každého ID.
  • Předvídatelnost: Se znalostí struktury CUID v1 bylo možné odvodit část vnitřního stavu.
  • Nedostatek kryptografické bezpečnosti: CUID v1 explicitně nepoužíval kryptograficky bezpečný generátor náhodných čísel.

CUID2 tyto obavy řeší použitím SHA3, CSPRNG a skrytím časového razítka.

Principy návrhu

Kryptografická bezpečnost
Používá CSPRNG a SHA3 k zajištění nepředvídatelnosti ID i při znalosti časového rámce.
Soukromí časového razítka
Časové razítko je smícháno do hashe a neobjevuje se přímo, čímž chrání soukromí časování.
Přizpůsobitelný prefix
Zadejte vlastní prefix pro rozlišení ID různých typů entit (např. usr_, prd_).
Přizpůsobitelná délka
Výchozí délka je 24 znaků, ale lze ji přizpůsobit požadavkům aplikace.
Sdílený otisk
Sdílení náhodné hodnoty otisku napříč voláními funkcí pro lepší distribuci entropie.
Kompatibilní s databázemi
Vždy začíná abecedním znakem, kompatibilní s názvy proměnných a databázovými omezeními.

CUID2 vs CUID v1

Porovnání klíčových charakteristik mezi oběma generacemi:

AtributCUID2CUID v1
BezpečnostKryptografická (SHA3+CSPRNG)Nekryptografická
PředvídatelnostVelmi nízkáNízká (odhalené časové razítko)
DélkaPřizpůsobitelná (výchozí 24)Pevných 25 znaků
PrefixPřizpůsobitelnýPevné 'c'
DistribuceRovnoměrně distribuovanáVychýlená k časovému razítku
StavAktivní a doporučenýZastaralý

CUID2 vs UUID v4

Porovnání s běžným standardem UUID:

AtributCUID2UUID v4
Výchozí délka24 znaků36 znaků
Bezpečný pro URLAnoAno (s pomlčkami)
Vlastní délkaAnoNe
TříditelnýNeNe
EntropieVysoká (SHA3)Vysoká (CSPRNG)
Sada znakůMalá alfanumerická písmenaHex + pomlčky

CUID2 poskytuje zaručený abecední prefix a flexibilní délku se srovnatelnou bezpečností jako UUID v4.

Kdo používá CUID2?

CUID2 byl přijat prominentními komunitami a frameworky:

  • Prisma podporuje CUID2 jako typ ID v poli @id prostřednictvím @default(cuid()).
  • Komunita Drizzle ORM přijala CUID2 pro výchozí ID.
  • Projekty SvelteKit a Remix jej používají pro ID relací.
  • Vysoce zatížené API servery, které potřebují sledovatelná ID v logách.
  • Aplikace synchronizující data přes více databází nebo regionů.

Příklady kódu

Instalace a použití: pnpm add @paralleldrive/cuid2

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"

Pokročilá konfigurace:

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

Integrace s databází:

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"

Nejčastěji kladené otázky

Je CUID2 pomalejší než CUID v1 kvůli SHA3?
Mírně — SHA3 je pomalejší než vlastní algoritmus CUID v1, ale rozdíl je v většině aplikací nepostřehnutelný. CUID2 generuje desítky tisíc ID za sekundu, což je mnohem rychlejší než typický databázový round-trip.
Mohu upgradovat z CUID v1 na CUID2 bez migrace dat?
Můžete přidat sloupec CUID2 a postupně přecházet pro nové záznamy. Pokud používáte CUID jako primární klíč, budete potřebovat plán migrace, protože formáty se liší.
Kolik entropie má CUID2?
Při výchozí délce 24 znaků poskytuje CUID2 přibližně 118 bitů entropie — více než UUID v4 (122 náhodných bitů, ale některé jsou určeny pro verzi). Vlastní délka upravuje entropii lineárně.
Je CUID2 vhodný pro soukromí orientovaná ID?
Ano — na rozdíl od CUID v1 CUID2 nevyzrazuje čas vytvoření ani informace o hostiteli. Časové razítko je smícháno do hashe a nelze jej extrahovat pouze z ID.
Jaká je optimální délka pro CUID2?
Délka 24 (výchozí) je dostatečná pro většinu aplikací. Pokud generujete miliony ID denně, zvažte zvýšení na 32. Doporučené minimum je 16 znaků pro zachování dostatečné odolnosti vůči kolizím.
Mohu CUID2 používat v prohlížeči?
Ano — knihovna CUID2 běží v prohlížeči prostřednictvím Web Crypto API a v Node.js prostřednictvím modulu crypto. Vhodná pro klientské i serverové aplikace.