مولّد CUID2

يولد معرفات CUID2 آمنة من الجيل التالي

العدد
الطول

CUID2s المولّدة

انقر على توليد لإنشاء CUID2s

ما هو CUID2؟

CUID2 هو الجيل الثاني من معرّف CUID، أُعيدت كتابته من الصفر بتركيز على الأمان التشفيري والخصوصية.

على عكس CUID v1 الذي يُضمّن الطابع الزمني بشكل مرئي، يُخفي CUID2 جميع مكوناته داخل هاش SHA3، مما يُنتج سلاسل لا يمكن التنبؤ بها عملياً.

تبدأ المعرّفات ببادئة حرفية قابلة للتخصيص (افتراضياً c) تليها سلسلة مرمَّزة بـ base36 من هاش SHA3.

لماذا CUID2؟

جاء CUID2 استجابةً لمخاوف أمنية محددة في CUID v1:

  • الطابع الزمني المرئي: كان CUID v1 يكشف وقت الإنشاء في بداية كل معرّف.
  • القابلية للتنبؤ: مع معرفة بنية CUID v1، كان بالإمكان استنتاج جزء من الحالة الداخلية.
  • نقص الأمان التشفيري: لم يكن CUID v1 يستخدم مولد أرقام عشوائية تشفيرياً آمناً بشكل صريح.

يعالج CUID2 هذه المخاوف باستخدام SHA3 وCSPRNG وإخفاء الطابع الزمني.

مبادئ التصميم

الأمان التشفيري
يستخدم CSPRNG وSHA3 لضمان عدم إمكانية التنبؤ بالمعرّفات حتى مع معرفة الإطار الزمني.
خصوصية الطابع الزمني
الطابع الزمني مُدمَج في الهاش ولا يظهر بشكل مباشر، مما يحمي خصوصية التوقيت.
البادئة القابلة للتخصيص
يمكنك تحديد بادئة مخصصة لتمييز معرّفات أنواع الكيانات المختلفة (مثل usr_, prd_).
الطول القابل للتخصيص
الطول افتراضي 24 حرفاً لكن يمكن ضبطه حسب متطلبات تطبيقك.
مشترك الثبات
مشاركة قيمة ثابتة عشوائية بين استدعاءات الدالة لتحسين توزيع الإنتروبيا.
التوافق مع قواعد البيانات
يبدأ دائماً بحرف أبجدي، متوافق مع أسماء المتغيرات وقيود قواعد البيانات.

CUID2 مقابل CUID v1

مقارنة الخصائص الرئيسية بين الجيلين:

الخاصيةCUID2CUID v1
الأمانتشفيري (SHA3+CSPRNG)غير تشفيري
القابلية للتنبؤمنخفضة جداًمنخفضة (طابع زمني مكشوف)
الطولقابل للتخصيص (24 افتراضي)25 حرفاً ثابتة
البادئةقابلة للتخصيصثابتة 'c'
التوزيعموزع بالتساويمتحيز نحو الطابع الزمني
الحالةنشط ومُوصى بهقديم

CUID2 مقابل UUID v4

مقارنة مع معيار UUID الشائع:

الخاصيةCUID2UUID v4
الطول الافتراضي24 حرفاً36 حرفاً
آمن للعناويننعمنعم (مع الشُرَط)
طول مخصصنعملا
قابل للترتيبلالا
الإنتروبياعالية (SHA3)عالية (CSPRNG)
مجموعة الأحرفحروف وأرقام صغيرةست عشري + شُرَط

CUID2 يوفر بادئات أبجدية مضمونة وطولاً مرناً مع أمان مكافئ لـ UUID v4.

من يستخدم CUID2؟

تبنّى CUID2 مجتمعات وأطر عمل بارزة:

  • Prisma — يدعم CUID2 كنوع معرّف في حقل @id عبر @default(cuid()).
  • مجتمع Drizzle ORM يتبنّى CUID2 للمعرّفات الافتراضية.
  • مشاريع SvelteKit وRemix تستخدمه لمعرّفات الجلسات.
  • خوادم API عالية الحجم تحتاج إلى معرّفات يمكن تتبعها في السجلات.
  • التطبيقات التي تتزامن عبر عدة قواعد بيانات أو مناطق.

أمثلة برمجية

التثبيت والاستخدام: 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 عشرات الآلاف من المعرّفات في الثانية، وهو أسرع بكثير من قرن قاعدة بيانات نموذجي.
هل يمكنني الترقية من CUID v1 إلى CUID2 بدون هجرة بيانات؟
يمكنك إضافة عمود CUID2 والانتقال تدريجياً للسجلات الجديدة. إذا استخدمت CUID كمفتاح أساسي، فأنت بحاجة إلى خطة هجرة لأن صيغتهما تختلف.
ما حجم إنتروبيا CUID2؟
عند الطول الافتراضي 24 حرفاً، يوفر CUID2 حوالي 118 بت من الإنتروبيا — أكثر من UUID v4 (122 بت عشوائي، لكن بعضها محدد للنسخة). الطول المخصص يعدّل الإنتروبيا بشكل خطي.
هل CUID2 مناسب لمعرّفات موجهة نحو الخصوصية؟
نعم — على عكس CUID v1، لا يُسرّب CUID2 وقت الإنشاء أو معلومات المضيف. الطابع الزمني مُدمَج في الهاش ولا يمكن استخراجه من المعرّف وحده.
ما الطول الأمثل لـ CUID2؟
الطول 24 (الافتراضي) كافٍ لمعظم التطبيقات. إذا كنت تنشئ ملايين المعرّفات يومياً، فكّر في الزيادة إلى 32. الحد الأدنى المُوصى به هو 16 حرفاً للحفاظ على مقاومة كافية للتصادم.
هل يمكنني استخدام CUID2 في المتصفح؟
نعم — مكتبة CUID2 تعمل في المتصفح عبر Web Crypto API، وفي Node.js عبر crypto module. مناسبة لتطبيقات طرف العميل والخادم على حد سواء.