مولّد CUID

يولد معرفات فريدة مقاومة للتصادم (CUID v1)

العدد

CUIDs المولّدة

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

CUID v1 تنسيق قديم. للمشاريع الجديدة، استخدم CUID2.

ما هو CUID؟

CUID (معرّف فريد مقاوم للتصادم) هو معرّف فريد عالمياً صُمِّم للتطبيقات الأفقية قابلة التوسع.

يبدأ دائماً بالحرف c، يليه طابع زمني وعداد وبصمة مضيف ومقطع عشوائي — وكلها مرمَّزة بـ base36.

تكون المعرّفات آمنة للعناوين وصغيرة الحجم ومقروءة، مما يجعلها مناسبة لمعرّفات قواعد البيانات وعناوين URL وعمليات إنشاء الجلسات.

بنية CUID

يتكوّن كل CUID من خمسة أقسام محددة تضمن الفريدية عبر الأجهزة والعمليات والوقت:

مثال:: clrc4gkwz001ag2hs3k7f9m2q
cالبادئةالحرف الثابت 'c' لتمييز المعرّف
lrc4gkwzالطابع الزمنيوقت Unix بالميلي ثانية، مرمَّز بـ base36
001aالعدادعداد تسلسلي لمنع التصادمات في الوقت الواحد
g2hsالبصمةبصمة فريدة للمضيف من معرّف العملية واسم الجهاز
3k7f9m2qالعشوائيمقطع عشوائي لمزيد من الفريدية

يضمن هذا التصميم الهرمي ترتيب المعرّفات زمنياً مع الحفاظ على فريدية تشتيتية مناسبة للأنظمة الموزعة.

مقاومة التصادم

يدمج CUID عدة آليات لضمان الفريدية:

الدقة الزمنية
دقة الميلي ثانية تعني أن المعرّفات التي تنشأ في مسارات تنفيذ مختلفة تبدأ بقيم مختلفة في معظم الأحيان.
العداد التسلسلي
حتى لو أُنشئ معرّفان في نفس الميلي ثانية، يتصاعد العداد ضامناً الفريدية داخل العملية الواحدة.
بصمة الجهاز
تميّز البصمة المستمدة من معرّف العملية واسم المضيف المعرّفات الصادرة من خوادم مختلفة.
الإنتروبيا العشوائية
يضيف المقطع العشوائي طبقة دفاع إضافية ضد أي تصادمات متبقية.

CUID مقابل UUID

كل من CUID وUUID يحلّان مشكلة الفريدية لكن بمقاربات مختلفة:

الميزةCUID v1UUID v4
الصيغةحروف وأرقام صغيرةست عشري بشُرَط
قابل للترتيبجزئياً (الطابع الزمني أولاً)لا (v4 عشوائي)
آمن للعناويننعمنعم (مع الشُرَط)
مقاومة التصادمعالية (بنيوية)عالية (إحصائية)
القابلية للتنبؤمنخفضة (طابع زمني مرئي)منخفضة جداً
الطول25 حرفاً36 حرفاً
يتطلب تنسيقاًلالا

CUID أفضل لمعرّفات قواعد البيانات المرئية وعناوين URL؛ UUID أكثر شيوعاً وأوسع دعماً.

CUID v1 مقابل CUID v2

يُعدّ CUID v2 مراجعة كاملة للخوارزمية تُعالج مخاوف الأمان في CUID v1:

الجانبCUID v1CUID v2
الخوارزميةخوارزمية مخصصةSHA3 + CSPRNG
التشفيرلا (قابل للتنبؤ)نعم (آمن تشفيرياً)
الطابع الزمنيمرئي بوضوحمخفي في الهاش
الصيغةيبدأ بـ 'c' دائماًبادئة قابلة للتخصيص
حزمة npmcuid@paralleldrive/cuid2
الطول25 حرفاً ثابتةقابل للتخصيص (24 افتراضي)

بالنسبة للمشاريع الجديدة، يُوصى باستخدام CUID v2 الذي يوفر ضمانات أمان أقوى مع الحفاظ على سهولة الاستخدام.

حالات الاستخدام الشائعة

معرّفات قواعد البيانات
مثالي كمفاتيح أساسية — قابل للقراءة، صغير الحجم، آمن للعناوين بدون تشفير.
إدارة الجلسات
توليد معرّفات جلسات فريدة لتطبيقات الويب مع مقاومة التخمين.
معرّفات الطلبات
تتبع الطلبات عبر الأنظمة الموزعة بمعرّف فريد قابل للتسجيل والتتبع.
معرّفات الملفات
إنشاء أسماء ملفات فريدة للمحتوى المُرفَّع أو الملفات المؤقتة.
مزامنة البيانات
مزامنة البيانات عبر أجهزة متعددة أو قواعد بيانات موزعة بثقة في الفريدية.
معرّفات عناوين URL
إنشاء روابط قصيرة أو معرّفات مقاطع فيديو مع ضمان تشابك محدود.

أمثلة برمجية

التثبيت والاستخدام الأساسي:

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'

استخدام قيد قاعدة البيانات:

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 فريد حقاً عبر خوادم مختلفة؟
نعم — تضمن آلية البصمة (معرّف العملية + اسم المضيف) أن المعرّفات الصادرة من خوادم مختلفة تتباين في جزء البصمة. يوفر العداد الزمني والمقطع العشوائي حماية إضافية.
هل يمكن استخدام CUID في المتصفح؟
نعم — مكتبة CUID متوافقة مع المتصفح وNode.js. في بيئة المتصفح، تستخدم البصمة معرّف الزيارة وبعض المعلومات بدلاً من بيانات العملية.
ما حجم CUID مقارنةً بالبدائل؟
CUID v1 طوله ثابت 25 حرفاً. UUID v4 طوله 36 حرفاً مع الشُرَط. NanoID قابل للتخصيص وعادةً 21 حرفاً. CUID v2 قابل للتخصيص، 24 حرفاً افتراضياً.
هل CUID آمن لأغراض التشفير؟
CUID v1 ليس آمناً تشفيرياً — الطابع الزمني مرئي وبعض المكونات قابلة للتنبؤ. CUID v2 يستخدم SHA3 ومولد أرقام عشوائية تشفيري آمن، مما يجعله مناسباً للحالات الحرجة أمنياً.
ما الفرق الرئيسي بين CUID وNanoID؟
NanoID يركّز على الحجم الصغير والأمان التشفيري مع أحجام قابلة للتخصيص بالكامل. CUID يعطي أولوية للقابلية للترتيب الزمني الجزئي وسهولة التمييز البصري. CUID v2 يجمع الأمان مع هوية قابلة للتعرف عليها.
كيف يتعامل CUID مع التصادمات؟
التصادمات نظرياً ممكنة لكن غير محتملة إحصائياً. يعمل العداد على منع التصادمات داخل العملية الواحدة؛ البصمة تفصل بين الأجهزة المختلفة؛ والمقطع العشوائي يتعامل مع الحالات الحدية. الخوارزمية مُصمَّمة لأنظمة الإنتاج في الحياة الواقعية.