ToolDeck

CUID2 Generator

Generate secure next-generation CUID2 identifiers

Count
Length

Generated CUID2s

Click Generate to create CUID2s

CUID2 چیست؟

CUID2 (شناسه یکتای مقاوم در برابر تصادم، نسخه ۲) جانشین رسمی CUID نسخه ۱ است. این ابزار شناسه‌های کوتاه، رمزنگاری‌شده و مبهمی تولید می‌کند که برای استفاده به عنوان کلید اصلی در پایگاه‌های داده، URL‌ها و سیستم‌های توزیع‌شده مناسب هستند.

بر خلاف نسخه قبلی، CUID2 هیچ اطلاعاتی درباره زمان ایجاد، دستگاه میزبان یا فرآیندی که آن را تولید کرده فاش نمی‌کند. هر شناسه یک رشته تصادفی به نظر می‌رسد که با یک حرف کوچک تصادفی شروع می‌شود و با یک هش base-36 مشتق‌شده از SHA-512 ادامه می‌یابد. طول پیش‌فرض ۲۴ کاراکتر است، اما می‌توانید آن را از ۲ تا ۳۲ کاراکتر تنظیم کنید.

CUID2 توسط ابزارهای مدرن پایگاه داده به‌طور گسترده توصیه می‌شود. Prisma آن را به عنوان استراتژی پیش‌فرض شناسه برای @default(cuid()) خود پذیرفت، و PlanetScale، Neon و سایر ارائه‌دهندگان پایگاه داده بدون سرور CUID2 را صراحتاً به عنوان فرمت شناسه ترجیحی فهرست می‌کنند.

چرا CUID2 جایگزین CUID نسخه ۱ شد

CUID نسخه ۱، که در سال ۲۰۱۲ توسط اریک الیوت منتشر شد، یک پیشرفت بزرگ نسبت به UUID‌های ساده برای تولید شناسه در سمت کلاینت بود. با این حال، محققان امنیتی دو مشکل اساسی در طراحی آن کشف کردند:

  • اثرانگشت‌گذاری: اثر انگشت میزبان جاسازی‌شده در هر مقدار CUID نسخه ۱ می‌توانست برای شناسایی دستگاه یا فرآیندی که شناسه را تولید کرده استفاده شود و متادیتای عملیاتی را برای هر کسی که می‌توانست شناسه‌ها را مشاهده کند فاش کند.
  • قابلیت پیش‌بینی: از آنجایی که CUID نسخه ۱ یک شمارنده یکنوا و یک بخش زمان‌نگار را در خود داشت، مهاجمی که چندین شناسه را مشاهده کرده بود می‌توانست محدوده تقریبی شناسه‌های آینده را پیش‌بینی کند و حملات شمارش را علیه API‌هایی که از شناسه‌ها به عنوان تنها بررسی مجوز استفاده می‌کنند فعال کند.
  • هش غیر رمزنگاری: CUID نسخه ۱ از یک مرحله هش‌گذاری غیر رمزنگاری ساده استفاده می‌کرد که استانداردهای امنیتی مدرن را برآورده نمی‌کرد.

اریک الیوت، نویسنده اصلی، CUID نسخه ۱ را رسماً منسوخ اعلام کرد و CUID2 را از ابتدا برای رفع همه این مشکلات نوشت. الگوریتم جدید از Web Crypto API (SHA-512) استفاده می‌کند. همه اجزای قطعی حذف شده‌اند و هر شناسه از نظر آماری مستقل از هر شناسه دیگری است.

اصول طراحی CUID2

غیرقابل پیش‌بینی
هیچ زمان‌نگار، شمارنده یا اثر انگشت میزبانی جاسازی نشده است. هر شناسه از یک نمک رمزنگاری تصادفی تازه ترکیب‌شده با SHA-512 تولید می‌شود.
توزیع یکنواخت
رمزگذاری base-36 از خروجی SHA-512 توزیع کاراکترهای تقریباً یکنواخت تولید می‌کند و فشار روی ایندکس‌گذاری در پایگاه‌های داده B-tree را کاهش می‌دهد.
به‌طور پیش‌فرض ایمن برای URL
الفبا به حروف کوچک a-z و ارقام ۰-۹ محدود شده — بدون خط تیره، زیرخط یا حروف مختلط — که شناسه‌ها را بدون رمزگذاری درصدی در URL‌ها ایمن می‌کند.
طول قابل تنظیم
شما طول را انتخاب می‌کنید (۲-۳۲). شناسه‌های کوتاه‌تر احتمال تصادم بیشتری دارند؛ پیش‌فرض توصیه‌شده ۲۴ حدود ۴ × ۱۰³⁷ مقدار یکتا می‌دهد.
همیشه با یک حرف شروع می‌شود
اولین کاراکتر همیشه یک حرف کوچک تصادفی است و تضمین می‌کند که مقادیر CUID2 شناسه‌های عنصر HTML و انتخابگرهای CSS معتبری هستند که بدون نیاز به escape می‌توان از آن‌ها استفاده کرد.
نیازی به سرور نیست
CUID2 صرفاً به Web Crypto API موجود در همه مرورگرهای مدرن و Node.js 15+ متکی است، بنابراین شناسه‌ها می‌توانند با همان ضمانت‌های امنیتی سرور در کلاینت تولید شوند.

CUID2 در مقابل CUID نسخه ۱ — مقایسه

جدول زیر تفاوت‌های کلیدی بین CUID2 و CUID نسخه ۱ منسوخ‌شده را خلاصه می‌کند. اگر در حال حاضر از CUID نسخه ۱ استفاده می‌کنید، مهاجرت به CUID2 توصیه می‌شود.

ویژگیCUID2CUID نسخه ۱
امنیترمزنگاری (SHA-512)غیر رمزنگاری (مبتنی بر اثر انگشت)
قابلیت پیش‌بینیمبهم — بدون متادیتای فاش‌شدهزمان‌نگار + اثر انگشت در شناسه قابل مشاهده
طولقابل تنظیم (۲-۳۲ کاراکتر)ثابت ۲۵ کاراکتر
پیشوندحرف تصادفی a-zهمیشه با «c» شروع می‌شود
توزیعیکنواخت / همواربخش‌های یکنوا افزایشی
وضعیتبه‌طور فعال نگهداری می‌شودتوسط نویسنده اصلی منسوخ شده

CUID2 در مقابل UUID نسخه ۴ — مقایسه

UUID نسخه ۴ استاندارد غالب برای شناسه‌های یکتای تصادفی است. CUID2 چندین مزیت عملی نسبت به UUID نسخه ۴ بدون به‌خطر انداختن امنیت ارائه می‌دهد.

ویژگیCUID2UUID نسخه ۴
طول پیش‌فرض۲۴ کاراکتر۳۶ کاراکتر (با خط تیره)
ایمن برای URLبله — حروف کوچک a-z + ۰-۹نیاز به رمزگذاری دارد (شامل خط تیره)
طول سفارشیبله (۲-۳۲)خیر — همیشه ۱۲۸ بیت / ۳۶ کاراکتر
قابل مرتب‌سازیخیر (طبق طراحی)خیر (نسخه ۴ تصادفی است)
منبع آنتروپیSHA-512 + Web CryptoCSPRNG
مجموعه کاراکترBase-36 (a-z، ۰-۹)هگزادسیمال + خط تیره

مهم‌ترین تفاوت، سطح آشنایی است: UUID نسخه ۴ یک استاندارد IETF (RFC 4122) است که توسط تقریباً هر پایگاه داده، زبان برنامه‌نویسی و چارچوب API به‌طور آماده شناخته می‌شود. CUID2 یک استاندارد جامعه است با پشتیبانی رو به رشد اما نه همگانی. UUID نسخه ۴ را وقتی قابلیت همکاری با سیستم‌های خارجی اولویت دارد انتخاب کنید؛ CUID2 را وقتی هر دو طرف را در اختیار دارید و شناسه‌های کوتاه‌تر و ایمن برای URL را ترجیح می‌دهید انتخاب کنید.

چه کسانی از CUID2 استفاده می‌کنند

CUID2 در سراسر اکوسیستم مدرن جاوااسکریپت و تایپ‌اسکریپت پذیرش سریعی داشته است:

  • Prisma — محبوب‌ترین ORM تایپ‌اسکریپت از CUID2 به عنوان پیش‌فرض توصیه‌شده برای فیلدهای @id با @default(cuid()) در Prisma Schema نسخه ۲ به بالا استفاده می‌کند.
  • PlanetScale — مستندات و قالب‌های starter آن‌ها CUID2 را برای کلیدهای اصلی تولیدشده توسط اپلیکیشن برای جلوگیری از مشکلات عملکردی اسکن ترتیبی روی پلتفرم MySQL توزیع‌شده‌شان توصیه می‌کنند.
  • Drizzle ORM — یک helper پیش‌فرض cuid2() داخلی برای تعریف ستون‌ها ارائه می‌دهد.
  • boilerplate‌های tRPC — بسیاری از قالب‌های starter جامعه tRPC + Prisma با CUID2 به عنوان استراتژی کلید اصلی ارائه می‌شوند.
  • T3 Stack — ابزار scaffolding create-t3-app از Prisma با پیش‌فرض‌های CUID2 در فایل‌های schema تولیدشده استفاده می‌کند.

مثال‌های کد

بسته 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 با schema 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 نسخه ۱ سازگار به عقب است؟
خیر. شناسه‌های CUID2 کاملاً متفاوت از شناسه‌های CUID نسخه ۱ به نظر می‌رسند. CUID نسخه ۱ همیشه با حرف «c» شروع می‌شود و طول ثابت ۲۵ کاراکتر دارد. CUID2 با یک حرف تصادفی شروع می‌شود و طول قابل تنظیم دارد (پیش‌فرض ۲۴). اگر یک پایگاه داده موجود را مهاجرت دهید، باید هر دو فرمت را مدیریت کنید یا یک مهاجرت برای جایگزینی همه مقادیر CUID نسخه ۱ اجرا کنید.
چه طولی باید استفاده کنم؟
پیش‌فرض ۲۴ کاراکتر برای اکثر اپلیکیشن‌ها گزینه توصیه‌شده است. حدود ۴ × ۱۰³⁷ مقدار یکتا ارائه می‌دهد و تصادم را حتی در مقیاس بزرگ از نظر آماری غیرممکن می‌کند. از ۱۶ کاراکتر اگر ذخیره‌سازی حیاتی است و مجموعه داده‌تان زیر چند میلیارد رکورد است استفاده کنید. از ۳۲ کاراکتر برای حداکثر حاشیه امنیتی استفاده کنید.
آیا CUID2 بر اساس زمان ایجاد قابل مرتب‌سازی است؟
خیر — و این عمدی است. CUID2 عمداً همه اطلاعات زمانی را دور می‌اندازد تا از حملات شمارش‌گذاری و اثرانگشت‌گذاری جلوگیری کند. اگر به شناسه‌های مرتب‌شده بر اساس زمان نیاز دارید، ULID یا UUID نسخه ۷ را به جای آن در نظر بگیرید. CUID2 قابلیت مرتب‌سازی را فدای امنیت و مبهم بودن می‌کند.
CUID2 در مقابل NanoID — کدام را انتخاب کنم؟
هر دو امن و ایمن برای URL هستند. NanoID به‌طور پیش‌فرض با ۲۱ کاراکتر کمی کوتاه‌تر است و از یک الفبای بزرگ‌تر (A-Za-z0-9_-) استفاده می‌کند که آنتروپی بیشتری در هر کاراکتر می‌دهد. CUID2 از یک الفبای محدود (a-z، ۰-۹) استفاده می‌کند که در انتخابگرهای CSS ایمن‌تر است و همیشه با یک حرف شروع می‌شود. اگر حداکثر چگالی آنتروپی می‌خواهید NanoID را انتخاب کنید؛ اگر یکپارچگی با Prisma/ORM یا شناسه‌های ایمن برای CSS مهم است CUID2 را انتخاب کنید.
آیا CUID2 ایمن برای URL است؟
بله. CUID2 فقط از حروف کوچک (a-z) و ارقام (۰-۹) استفاده می‌کند. هیچ خط تیره، زیرخط، علامت مثبت، اسلش یا علامت مساوی ندارد، بنابراین می‌توان آن را مستقیماً در URL‌ها، ویژگی‌های id HTML، انتخابگرهای CSS و نام فایل‌ها بدون هیچ رمزگذاری جاسازی کرد.
آیا می‌توانم از CUID2 به عنوان کلید اصلی پایگاه داده استفاده کنم؟
بله، و این یکی از موارد اصلی استفاده است. CUID2 از الگوی ترتیبی اعداد صحیح خودافزا (که می‌تواند تعداد سطرها را فاش کند و شمارش‌گذاری را فعال کند) اجتناب می‌کند، از UUID کوتاه‌تر است (فضای ایندکس را ذخیره می‌کند) و ایمن برای URL است. اکثر پایگاه‌های داده آن را به عنوان ستون VARCHAR(24) یا TEXT ذخیره می‌کنند. توجه داشته باشید که بر خلاف ULID‌ها یا UUID نسخه ۷، مقادیر CUID2 مرتب‌شده بر اساس زمان نیستند، پس اگر کوئری‌هایتان به اسکن بر اساس ترتیب درج متکی هستند ممکن است یک گزینه قابل مرتب‌سازی را ترجیح دهید.