CUID2 Generator

Generate secure next-generation CUID2 identifiers

Количество
Длина

Сгенерированные CUID2

Нажмите «Сгенерировать» для создания CUID2

Что такое CUID2?

CUID2 (Collision-resistant Unique ID, версия 2) — преемник нового поколения CUID v1, разработанный для генерации коротких, криптографически безопасных и непрозрачных идентификаторов, безопасных для использования в качестве первичных ключей в базах данных, URL и распределённых системах.

В отличие от своего предшественника, CUID2 не раскрывает никакой информации о времени создания, хост-машине или процессе, создавшем его. Каждый идентификатор — это кажущаяся случайной строка, начинающаяся со случайной строчной буквы, за которой следует хэш base-36, полученный из SHA-512. Длина по умолчанию — 24 символа, но её можно настроить от 2 до 32 символов.

CUID2 широко рекомендуется современными инструментарием для работы с базами данных. Prisma принял его как стратегию идентификатора по умолчанию для своего скаляра @default(cuid()), а PlanetScale, Neon и другие бессерверные поставщики баз данных явно указывают CUID2 как предпочтительный формат.

Почему CUID2 Заменил CUID v1

CUID v1, выпущенный в 2012 году Эриком Эллиоттом, был значительным улучшением по сравнению с обычными UUID для генерации идентификаторов на стороне клиента. Однако исследователи безопасности обнаружили две фундаментальные проблемы в его дизайне:

  • Fingerprinting: Отпечаток хоста, встроенный в каждое значение CUID v1, мог использоваться для идентификации машины или процесса, создавшего идентификатор, раскрывая операционные метаданные всем, кто мог наблюдать идентификаторы.
  • Предсказуемость: Поскольку CUID v1 включал монотонно возрастающий счётчик и сегмент временной метки, злоумышленник, наблюдавший несколько идентификаторов, мог предсказать приблизительный диапазон будущих идентификаторов, что позволяло проводить атаки перечисления против API, использующих идентификаторы как единственную проверку авторизации.
  • Некриптографический хэш: CUID v1 использовал простой некриптографический шаг хэширования, не отвечавший современным стандартам безопасности.

Эрик Эллиотт, первоначальный автор, официально объявил CUID v1 устаревшим и создал CUID2 с нуля для решения всех этих проблем. Новый алгоритм использует Web Crypto API (SHA-512) и устраняет все детерминированные компоненты.

Принципы Дизайна CUID2

Непредсказуемый
Никаких временных меток, счётчиков или отпечатков хоста не встраивается. Каждый идентификатор генерируется из новой криптографической случайной соли в сочетании с SHA-512.
Равномерное распределение
Кодирование base-36 дайджеста SHA-512 производит почти равномерное распределение символов, уменьшая горячие точки индексации в B-дерево базах данных.
Безопасен для URL по умолчанию
Алфавит ограничен строчными буквами a–z и цифрами 0–9 — без дефисов, подчёркиваний или заглавных букв — что делает идентификаторы безопасными в URL без процентного кодирования.
Настраиваемая длина
Вы выбираете длину (2–32). Более короткие идентификаторы означают более высокую вероятность коллизии; рекомендуемое значение по умолчанию 24 даёт ~4 × 10³⁷ уникальных значений.
Всегда начинается с буквы
Первый символ всегда является случайной строчной буквой, гарантируя, что значения CUID2 являются допустимыми HTML-идентификаторами элементов и CSS-селекторами без экранирования.
Сервер не требуется
CUID2 использует исключительно Web Crypto API, доступный во всех современных браузерах и Node.js 15+, поэтому идентификаторы могут генерироваться на стороне клиента с теми же гарантиями безопасности, что и на сервере.

CUID2 vs CUID v1 — Сравнение

Таблица ниже суммирует ключевые различия между CUID2 и ныне устаревшим CUID v1. Если вы сейчас используете CUID v1, настоятельно рекомендуется перейти на CUID2.

АтрибутCUID2CUID v1
БезопасностьКриптографический (SHA-512)Некриптографический (на основе отпечатка)
ПредсказуемостьНепрозрачный — метаданные не раскрываютсяВременная метка + отпечаток видны в идентификаторе
ДлинаНастраиваемая (2–32 символа)Фиксированная 25 символов
ПрефиксСлучайная буква a–zВсегда начинается с "c"
РаспределениеПлоское / равномерноеМонотонно возрастающие сегменты
СтатусАктивно поддерживаетсяУстарел по решению первоначального автора

CUID2 vs UUID v4 — Сравнение

UUID v4 является доминирующим стандартом для случайных уникальных идентификаторов. CUID2 предлагает ряд практических преимуществ перед UUID v4 без ущерба для безопасности.

АтрибутCUID2UUID v4
Длина по умолчанию24 символа36 символов (с дефисами)
Безопасен для URLДа — строчные a–z + 0–9Требует кодирования (содержит дефисы)
Пользовательская длинаДа (2–32)Нет — всегда 128 бит / 36 символов
СортируемыйНет (по дизайну)Нет (v4 случайный)
Источник энтропииSHA-512 + Web CryptoCSPRNG
Набор символовBase-36 (a–z, 0–9)Hex + дефисы

Главный компромисс — знакомость: UUID v4 является стандартом IETF (RFC 4122), распознаваемым практически каждой базой данных, языком программирования и API-фреймворком. CUID2 — это стандарт сообщества с растущей, но не универсальной поддержкой. Выбирайте UUID v4, когда приоритетна совместимость с внешними системами; выбирайте CUID2, когда контролируете оба конца и предпочитаете более короткие, безопасные для URL идентификаторы.

Кто Использует CUID2

CUID2 быстро получил распространение в современной экосистеме JavaScript и TypeScript:

  • Prisma — самый популярный TypeScript ORM использует CUID2 как рекомендуемый по умолчанию для полей @id с @default(cuid()) в Prisma Schema v2+.
  • PlanetScale — их документация и стартовые шаблоны рекомендуют CUID2 для первичных ключей, создаваемых приложением, чтобы избежать проблем с производительностью последовательного сканирования на их распределённой платформе MySQL.
  • Drizzle ORM — предоставляет встроенный вспомогательный метод cuid2() по умолчанию для определений столбцов.
  • tRPC-шаблоны — многие шаблоны сообщества tRPC + Prisma поставляются с CUID2 в качестве стратегии первичного ключа.
  • T3 Stack — инструмент scaffolding create-t3-app использует Prisma с CUID2 по умолчанию в сгенерированных файлах схемы.

Примеры Кода

Официальный npm-пакет @paralleldrive/cuid2 предоставляет простой 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"

Использование CUID2 со схемой Prisma:

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

Генерация CUID2 в Node.js без npm-пакета (используя только Web Crypto API, как это делает данный инструмент в браузере):

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?
Нет. Идентификаторы CUID2 выглядят совершенно иначе, чем CUID v1. CUID v1 всегда начинается с буквы "c" и имеет фиксированную длину 25 символов. CUID2 начинается со случайной буквы и имеет настраиваемую длину (по умолчанию 24). При миграции существующей базы данных потребуется обработка обоих форматов или миграция для замены всех значений CUID v1.
Какую длину использовать?
По умолчанию 24 символа — рекомендуемый выбор для большинства приложений. Он обеспечивает примерно 4 × 10³⁷ уникальных значений, делая коллизии статистически невозможными даже в масштабе. Используйте 16 символов, если хранилище критично и ваш набор данных содержит менее нескольких миллиардов записей. Используйте 32 символа для максимальной безопасности.
Можно ли сортировать CUID2 по времени создания?
Нет — и это намеренно. CUID2 намеренно отбрасывает всю временну́ю информацию для предотвращения атак перечисления и fingerprinting. Если вам нужны идентификаторы, упорядоченные по времени, рассмотрите ULID или UUID v7. CUID2 жертвует сортируемостью ради безопасности и непрозрачности.
CUID2 vs NanoID — что выбрать?
Оба безопасны и безопасны для URL. NanoID немного короче (21 символ по умолчанию) и использует больший алфавит (A–Za–z0–9_-), давая больше энтропии на символ. CUID2 использует ограниченный алфавит (a–z, 0–9), более безопасный в CSS-селекторах, и всегда начинается с буквы. Выбирайте NanoID для максимальной плотности энтропии; выбирайте CUID2, если важна интеграция с Prisma/ORM или CSS-безопасные идентификаторы.
Является ли CUID2 безопасным для URL?
Да. CUID2 использует только строчные буквы (a–z) и цифры (0–9). Он не содержит дефисов, подчёркиваний, знаков плюс, косых черт или знаков равенства, поэтому может быть встроен непосредственно в URL, атрибуты id HTML, CSS-селекторы и имена файлов без какого-либо кодирования.
Можно ли использовать CUID2 в качестве первичного ключа базы данных?
Да, и это один из основных вариантов использования. CUID2 избегает последовательного паттерна целых чисел с автоинкрементом (которые могут раскрывать количество строк и позволять перечисление), короче UUID (экономит место в индексах) и безопасен для URL. Большинство баз данных хранят его в столбце VARCHAR(24) или TEXT. Обратите внимание, что в отличие от ULID или UUID v7, значения CUID2 не упорядочены по времени, поэтому если ваши запросы сильно зависят от сканирования в порядке вставки, вы можете предпочесть сортируемую альтернативу.