CUID2 Generator

Generate secure next-generation CUID2 identifiers

Кількість
Довжина

Згенеровані CUID2

Натисніть «Згенерувати» для створення CUID2

Що таке CUID2?

CUID2 — це друге покоління CUID, переписане з нуля з акцентом на криптографічну безпеку та конфіденційність.

На відміну від CUID v1, який видимо вбудовує мітку часу, CUID2 приховує всі компоненти в хеші SHA3, створюючи практично непередбачувані рядки.

ID починаються з налаштовуваного буквеного префікса (за замовчуванням c), за яким іде рядок base36 з хешу SHA3.

Чому CUID2?

CUID2 з'явився у відповідь на конкретні проблеми безпеки в CUID v1:

  • Відкрита мітка часу: CUID v1 розкривав час створення на початку кожного ID.
  • Передбачуваність: Знаючи структуру CUID v1, можна було вивести частину внутрішнього стану.
  • Відсутність криптографічної безпеки: CUID v1 явно не використовував криптографічно безпечний генератор випадкових чисел.

CUID2 вирішує ці проблеми, використовуючи SHA3, CSPRNG та приховування мітки часу.

Принципи проектування

Криптографічна безпека
Використовує CSPRNG та SHA3 для забезпечення непередбачуваності ID навіть при відомому часовому діапазоні.
Конфіденційність мітки часу
Мітка часу змішується в хеш і не з'являється безпосередньо, захищаючи конфіденційність часу.
Налаштовуваний префікс
Вкажіть власний префікс для розрізнення ID різних типів сутностей (наприклад, usr_, prd_).
Налаштовувана довжина
Довжина за замовчуванням — 24 символи, але може бути змінена відповідно до потреб застосунку.
Спільний відбиток
Спільне використання випадкового значення відбитку між викликами функцій для кращого розподілу ентропії.
Сумісний з базами даних
Завжди починається з буквеного символу, сумісного з іменами змінних та обмеженнями баз даних.

CUID2 проти CUID v1

Порівняння ключових характеристик між двома поколіннями:

АтрибутCUID2CUID v1
БезпекаКриптографічна (SHA3+CSPRNG)Некриптографічна
ПередбачуваністьДуже низькаНизька (відкрита мітка часу)
ДовжинаНалаштовувана (за замовчуванням 24)Фіксована 25 символів
ПрефіксНалаштовуванийФіксований 'c'
РозподілРівномірно розподіленийЗміщений до мітки часу
СтатусАктивний та рекомендованийЗастарілий

CUID2 проти UUID v4

Порівняння зі звичайним стандартом UUID:

АтрибутCUID2UUID v4
Довжина за замовчуванням24 символи36 символів
Безпечний для URLТакТак (з дефісами)
Власна довжинаТакНі
СортуванняНіНі
ЕнтропіяВисока (SHA3)Висока (CSPRNG)
Набір символівРядкові буквено-цифрові символиHex + дефіси

CUID2 забезпечує гарантований буквений префікс та гнучку довжину з безпекою, еквівалентною UUID v4.

Хто використовує CUID2?

CUID2 прийнятий видатними спільнотами та фреймворками:

  • Prisma підтримує CUID2 як тип ID у полі @id через @default(cuid()).
  • Спільнота Drizzle ORM використовує CUID2 для ID за замовчуванням.
  • Проекти SvelteKit та Remix використовують його для ідентифікаторів сесій.
  • Високонавантажені API-сервери, яким потрібні відстежувані ID у журналах.
  • Застосунки, що синхронізують дані між кількома базами даних або регіонами.

Приклади коду

Встановлення та використання: 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"

Розширена конфігурація:

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

Інтеграція з базою даних:

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"

Часті запитання

Чи є CUID2 повільнішим за CUID v1 через SHA3?
Незначно — SHA3 повільніший за власний алгоритм CUID v1, але різниця непомітна в більшості застосунків. CUID2 генерує десятки тисяч ID на секунду, що значно швидше за типовий round-trip до бази даних.
Чи можна оновитися з CUID v1 до CUID2 без міграції даних?
Можна додати стовпець CUID2 і поступово переходити для нових записів. Якщо CUID використовується як первинний ключ, потрібен план міграції, оскільки формати відрізняються.
Скільки ентропії має CUID2?
При довжині за замовчуванням 24 символи CUID2 забезпечує приблизно 118 бітів ентропії — більше, ніж UUID v4 (122 випадкових біти, але деякі визначені для версії). Власна довжина регулює ентропію лінійно.
Чи підходить CUID2 для ID, орієнтованих на конфіденційність?
Так — на відміну від CUID v1, CUID2 не розкриває час створення або інформацію про хост. Мітка часу змішана в хеш і не може бути витягнута лише з ID.
Яка оптимальна довжина для CUID2?
Довжина 24 (за замовчуванням) достатня для більшості застосунків. Якщо генеруєте мільйони ID на день, розгляньте збільшення до 32. Рекомендований мінімум — 16 символів для збереження достатньої стійкості до колізій.
Чи можна використовувати CUID2 у браузері?
Так — бібліотека CUID2 працює у браузері через Web Crypto API та в Node.js через модуль crypto. Підходить як для клієнтських, так і для серверних застосунків.