ToolDeck

CUID Generator

Generate collision-resistant unique IDs (CUID v1)

Count

Generated CUIDs

Click Generate to create CUIDs

CUID v1 is a legacy format. For new projects, use CUID2.

CUID چیست؟

CUID (شناسه یکتای مقاوم در برابر تصادم) یک الگوریتم متن‌باز برای تولید شناسه‌های یکتا است که بدون نیاز به هماهنگ‌کننده مرکزی در سیستم‌های توزیع‌شده به‌خوبی کار می‌کند. بر خلاف UUID ساده، CUID برای مقیاس‌پذیری افقی طراحی شده است — چندین سرور یا تب مرورگر می‌توانند مستقلاً شناسه تولید کنند با کمترین احتمال تصادم.

هر CUID با حرف کوچک c شروع می‌شود و فرمت آن را در نگاه اول قابل تشخیص می‌کند. کاراکترهای باقی‌مانده همه حروف و اعداد کوچک (base36) هستند، پس CUID ایمن برای URL است و می‌توان آن را مستقیماً به عنوان بخشی از مسیر URL یا کلید اصلی پایگاه داده بدون رمزگذاری اضافی استفاده کرد.

مشخصات اصلی CUID (نسخه ۱) توسط اریک الیوت ایجاد شد و از طریق بسته cuid در npm رواج یافت. اکنون توسط CUID نسخه ۲ جایگزین شده که امنیت رمزنگاری ارائه می‌دهد. این صفحه — و ابزار بالا — شناسه‌های CUID نسخه ۱ تولید می‌کند، فرمت کلاسیکی که هنوز به‌طور گسترده در کدبیس‌های تولیدی دیده می‌شود.

ساختار CUID

یک CUID نسخه ۱ تقریباً ۲۵ کاراکتر دارد و از پنج بخش متصل‌شده تشکیل می‌شود که هر کدام نوع متفاوتی از آنتروپی را حمل می‌کنند:

مثال: clrc4gkwz001ag2hs3k7f9m2q
cپیشوندهمیشه حرف «c» — نشانه CUID
lrc4gkwzزمان‌نگارزمان‌نگار میلی‌ثانیه در base36 (~۸ کاراکتر)
001aشمارندهشمارنده base36 با ۴ کاراکتر — از تصادم در همان میلی‌ثانیه جلوگیری می‌کند
g2hsاثر انگشتاثر انگشت میزبان base36 با ۴ کاراکتر (اطلاعات مرورگر/محیط)
3k7f9m2qتصادفیبلوک تصادفی base36 با ۸ کاراکتر — دو مقدار ۳۲ بیتی

بخش‌ها به‌سادگی به هم متصل می‌شوند — هیچ جداکننده‌ای وجود ندارد. طول کل بسته به مقدار زمان‌نگار جاری کمی تغییر می‌کند اما تقریباً ۲۵ کاراکتر باقی می‌ماند.

چگونه CUID از تصادم جلوگیری می‌کند

مقاومت در برابر تصادم از لایه‌بندی منابع مستقل آنتروپی ناشی می‌شود. حتی در بدترین سناریوها — هزاران شناسه تولیدشده در هر میلی‌ثانیه روی چندین دستگاه — احتمال تولید دو شناسه یکسان بسیار ناچیز است.

زمان‌نگار میلی‌ثانیه
بخش اول زمان جاری را در base36 رمزگذاری می‌کند. شناسه‌هایی که در لحظات مختلف تولید می‌شوند، به‌طور خودکار بر اساس زمان ایجاد مرتب می‌شوند — مفید برای صفحه‌بندی و اشکال‌زدایی.
شمارنده یکنوا
در همان فرآیند، شمارنده ۴ کاراکتری با هر شناسه تولیدشده افزایش می‌یابد. حتی اگر دو فراخوانی در همان میلی‌ثانیه روی همان دستگاه اتفاق بیفتد، شمارنده برای حداکثر ۶۵٬۵۳۶ شناسه در هر میلی‌ثانیه یکتایی را تضمین می‌کند.
اثر انگشت دستگاه
هش مشتق‌شده از داده‌های خاص محیط (شناسه فرآیند + نام میزبان در Node.js؛ ابعاد صفحه نمایش + اطلاعات navigator در مرورگر). این شناسه‌های تولیدشده روی میزبان‌های جداگانه را در دقیقاً همان میلی‌ثانیه با همان مقدار شمارنده از هم متمایز می‌کند.
بلوک تصادفی
۸ کاراکتر آخر از دو مقدار تصادفی ۳۲ بیتی مستقل رمزگذاری‌شده در base36 آمده‌اند. این یک لایه آنتروپی نهایی اضافه می‌کند که از تصادم محافظت می‌کند حتی اگر اثر انگشت دو دستگاه به مقدار یکسانی هش شود.

CUID در مقابل UUID نسخه ۴

هر دو CUID و UUID نسخه ۴ برای تولید شناسه در سمت کلاینت به‌طور گسترده استفاده می‌شوند. آن‌ها با رویکردهای متفاوتی با همان مشکل روبرو می‌شوند:

ویژگیCUID نسخه ۱UUID نسخه ۴
فرمتc + base36 (~۲۵ کاراکتر)گروه‌های هگزادسیمال (۳۶ کاراکتر با خط تیره)
قابل مرتب‌سازیتقریباً (پیشوند زمان‌نگار)خیر
ایمن برای URLبله (فقط حروف و اعداد)عمدتاً (خط تیره در URL‌ها قابل قبول است)
مقاومت در برابر تصادمبالا — زمان‌نگار + شمارنده + اثر انگشت + تصادفیبالا — ۱۲۲ بیت تصادفی
قابلیت پیش‌بینیجزئی (زمان‌نگار قابل مشاهده)هیچ (کاملاً تصادفی)
طول~۲۵ کاراکتر۳۶ کاراکتر
نیاز به هماهنگیخیرخیر

UUID نسخه ۴ برای سناریوهای حساس به امنیت گزینه ایمن‌تری است زیرا هیچ اطلاعاتی از زمان‌بندی فاش نمی‌کند. CUID زمانی برتری دارد که شناسه‌های کوتاه‌تر، بدون خط تیره و کمابیش قابل مرتب‌سازی بخواهید. این ویژگی‌ها آن را برای URL‌ها، نام فایل‌ها یا لاگ‌ها مناسب می‌کند — جایی که می‌خواهید از روی شناسه، زمان ایجاد رکورد را تشخیص دهید.

CUID نسخه ۱ در مقابل CUID نسخه ۲

مشخصات CUID به‌طور قابل توجهی تجدیدنظر شده است. درک تفاوت‌ها به شما کمک می‌کند نسخه مناسب را برای پروژه‌تان انتخاب کنید:

جنبهCUID نسخه ۱CUID نسخه ۲
الگوریتماجزای قطعیمبتنی بر SHA-3، کاملاً مبهم
رمزنگاریخیربله
زمان‌نگار قابل مشاهدهبلهخیر
فرمتبا «c» شروع می‌شودبا «c» شروع می‌شود (قابل تنظیم)
بسته npm@paralleldrive/cuid (منسوخ)@paralleldrive/cuid2
طول~۲۵ کاراکتر۲۴ کاراکتر (پیش‌فرض، قابل تنظیم)

برای پروژه‌های جدید، CUID نسخه ۲ گزینه توصیه‌شده است. ساختار مبتنی بر SHA-3 آن به این معناست که خروجی مبهم است — هیچ زمان‌نگار، شمارنده یا اثر انگشتی از شناسه قابل مهندسی معکوس نیست. فقط زمانی از CUID نسخه ۱ استفاده کنید که به سازگاری با مجموعه داده موجود نیاز دارید یا یک پیاده‌سازی بدون وابستگی می‌خواهید.

موارد استفاده

پایگاه داده‌های توزیع‌شده
چندین شارد پایگاه داده یا میکروسرویس می‌توانند کلیدهای اصلی را مستقلاً بدون جدول توالی یا سرویس شناسه مرکزی تولید کنند و یک نقطه شکست واحد را حذف می‌کنند.
تولید شناسه در سمت کلاینت
یک مرورگر می‌تواند یک CUID را قبل از ارسال به سرور به یک رکورد جدید اختصاص دهد، به‌روزرسانی‌های خوش‌بینانه UI را فعال می‌کند و رفت‌وبرگشت لازم برای دریافت شناسه تخصیص‌یافته توسط سرور را حذف می‌کند.
اپ‌های آفلاین-اول
اپ‌های موبایل یا PWA که بدون اتصال کار می‌کنند می‌توانند رکوردها را با شناسه‌های پایدار ایجاد کنند که از همگام‌سازی زنده می‌مانند — هنگامی که دستگاه آنلاین می‌شود هیچ تعارضی وجود ندارد.
اسلاگ‌های URL
CUID‌ها فقط شامل کاراکترهای الفبایی و عددی هستند و آن‌ها را برای جاسازی مستقیم در مسیرهای URL بدون رمزگذاری درصدی ایمن می‌کند. پیشوند زمان‌نگار یک مرتب‌سازی تقریبی بر اساس زمان ایجاد اضافه می‌کند.
همبستگی رویداد / لاگ
از آنجایی که زمان‌نگار در بخش اول رمزگذاری شده، ورودی‌های لاگ برچسب‌خورده با CUID‌ها حتی در میان تجمیع‌کننده‌های لاگ توزیع‌شده می‌توانند تقریباً بر اساس زمان ایجاد مرتب شوند.
پیش‌فرض ORM / Prisma
Prisma از CUID به عنوان استراتژی پیش‌فرض @id برای کلیدهای اصلی رشته‌ای استفاده می‌کند — @default(cuid()) — که آن را به یکی از گسترده‌ترین فرمت‌های شناسه در اکوسیستم جاوااسکریپت تبدیل می‌کند.

مثال‌های کد

بسته CUID نسخه ۲ رسمی (توصیه‌شده) را نصب کنید یا یک پیاده‌سازی حداقلی نسخه ۱ بدون وابستگی بنویسید:

JavaScript / TypeScript
// npm install @paralleldrive/cuid2  (recommended — CUID v2)
import { createId } from '@paralleldrive/cuid2'

const id = createId()
// → 'tz4a98xxat96iws9zmbrgj3a'

// Custom length
import { init } from '@paralleldrive/cuid2'
const createShortId = init({ length: 10 })
createShortId() // → 'zxp1l6mf4c'

اگر یک پیاده‌سازی Node.js بدون وابستگی برای الگوریتم نسخه ۱ ترجیح می‌دهید:

Node.js (no dependencies)
// Pure Node.js — CUID v1 style (no dependencies)
let counter = 0

function pad(str, size) {
  return str.padStart(size, '0').slice(-size)
}

function fingerprint() {
  const os = require('os')
  const source = [process.pid, os.hostname().length].join('')
  let hash = 0
  for (const c of source) {
    hash = ((hash << 5) - hash) + c.charCodeAt(0)
    hash |= 0
  }
  return pad(Math.abs(hash).toString(36), 4)
}

function cuid() {
  const timestamp = Date.now().toString(36)
  const cnt       = pad((counter++ & 0xffff).toString(36), 4)
  const fp        = fingerprint()
  const rnd       = pad(Math.floor(Math.random() * 0xffffffff).toString(36), 4)
              + pad(Math.floor(Math.random() * 0xffffffff).toString(36), 4)
  return 'c' + timestamp + cnt + fp + rnd
}

console.log(cuid()) // → 'clrc4gkwz001ag2hs3k7f9m2q'

استفاده از CUID به عنوان کلید اصلی پایگاه داده با Prisma و PostgreSQL:

Prisma / SQL
-- Use CUID as a primary key in PostgreSQL
CREATE TABLE users (
  id   TEXT        PRIMARY KEY DEFAULT gen_cuid(),
  name TEXT        NOT NULL,
  created_at TIMESTAMPTZ DEFAULT now()
);

-- Prisma schema (auto-generates CUID by default)
model User {
  id        String   @id @default(cuid())
  name      String
  createdAt DateTime @default(now())
}

سوالات متداول

آیا CUID برای URL ایمن است؟
بله. CUID نسخه ۱ فقط از حروف کوچک و اعداد (رمزگذاری base36) استفاده می‌کند که همه کاراکترهای ایمن برای URL هستند. هنگام استفاده از CUID در مسیر URL یا پارامتر کوئری نیازی به رمزگذاری درصدی نیست.
آیا CUID از نظر رمزنگاری امن است؟
خیر. CUID نسخه ۱ از Math.random() استفاده می‌کند و یک پیشوند زمان‌نگار قابل مشاهده دارد. برای مقاصد حساس به امنیت مانند توکن‌های نشست یا لینک‌های بازنشانی رمز عبور مناسب نیست. برای این موارد از crypto.randomUUID() یا CUID نسخه ۲ استفاده کنید.
CUID در مقابل NanoID — کدام را انتخاب کنم؟
NanoID از نظر رمزنگاری امن است، کوتاه‌تر (پیش‌فرض ۲۱ کاراکتر) است و از یک الفبای قابل سفارشی‌سازی استفاده می‌کند. NanoID را وقتی امنیت اهمیت دارد یا به شناسه‌ای کوتاه‌تر نیاز دارید انتخاب کنید. CUID را وقتی یک شناسه کمابیش قابل مرتب‌سازی با پیشوند زمان‌نگار می‌خواهید که برای اشکال‌زدایی انسان‌خوان باشد انتخاب کنید.
باید از CUID نسخه ۱ یا CUID نسخه ۲ استفاده کنم؟
CUID نسخه ۲ توصیه جاری است. از نظر رمزنگاری امن است، اطلاعات زمان‌بندی فاش نمی‌کند و به‌طور فعال نگهداری می‌شود. CUID نسخه ۱ زمانی مفید است که به یک پیاده‌سازی ساده بدون وابستگی نیاز دارید یا یک سیستم قدیمی را نگهداری می‌کنید. این ابزار شناسه‌های CUID نسخه ۱ تولید می‌کند.
CUID در مقابل ULID — تفاوت چیست؟
هر دو دارای پیشوند زمان‌نگار هستند و به‌صورت لغوی مرتب می‌شوند. ULID از Crockford base32 استفاده می‌کند (۱۲۸ بیت کل: ۴۸ بیت زمان‌نگار + ۸۰ بیت تصادفی) و در نتیجه کمی تصادفی‌تر است. CUID یک اثر انگشت دستگاه و یک شمارنده یکنوا دارد؛ این ترکیب مقاومت در برابر تصادم روی یک میزبان در همان میلی‌ثانیه را بهبود می‌دهد. ULID مرتب‌سازی قابل‌اطمینان‌تری ارائه می‌دهد زیرا زمان‌نگار بخش کامل مرتبه بالا را اشغال می‌کند.
آیا CUID تضمیناً یکتا است؟
هیچ طرح شناسه‌ای بدون یک هماهنگ‌کننده مرکزی نمی‌تواند ضمانت ریاضی بدهد. CUID تصادم را با ترکیب چهار منبع آنتروپی مستقل بسیار بعید می‌کند: زمان‌نگار، یک شمارنده هر-فرآیند، یک اثر انگشت دستگاه و داده تصادفی. در عمل، تصادم بسیار کمتر از خرابی سخت‌افزار محتمل است.