ما هو CUID؟
CUID (معرّف فريد مقاوم للتصادم) هو معرّف فريد عالمياً صُمِّم للتطبيقات القابلة للتوسع الأفقي.
يبدأ دائماً بالحرف c، يليه طابع زمني وعداد وبصمة مضيف ومقطع عشوائي — وكلها مرمَّزة بـ base36.
تكون المعرّفات url-safe وصغيرة الحجم ومقروءة، مما يجعلها مناسبة لمعرّفات قواعد البيانات وعناوين URL وعمليات إنشاء الجلسات.
بنية CUID
يتكوّن كل CUID من خمسة أقسام محددة تضمن الفريدية عبر الأجهزة والعمليات والوقت:
يضمن هذا التصميم الهرمي ترتيب المعرّفات زمنياً مع الحفاظ على فريدية موزعة مناسبة للأنظمة الموزعة.
مقاومة التصادم
يدمج CUID عدة آليات لضمان الفريدية:
CUID مقابل UUID
كل من CUID وUUID يحلّان مشكلة الفريدية لكن بمقاربات مختلفة:
| الميزة | CUID v1 | UUID v4 |
|---|---|---|
| الصيغة | حروف وأرقام صغيرة | ست عشري بشُرَط |
| قابل للترتيب | جزئياً (الطابع الزمني أولاً) | لا (v4 عشوائي) |
| آمن للعناوين | نعم | نعم (مع الشُرَط) |
| مقاومة التصادم | عالية (بنيوية) | عالية (إحصائية) |
| القابلية للتنبؤ | منخفضة (طابع زمني مرئي) | منخفضة جداً |
| الطول | 25 حرفاً | 36 حرفاً |
| يتطلب تنسيقاً | لا | لا |
CUID أفضل لمعرّفات قواعد البيانات المرئية وعناوين URL؛ UUID أكثر شيوعاً وأوسع دعماً.
CUID v1 مقابل CUID v2
يُعدّ CUID v2 مراجعة كاملة للخوارزمية تُعالج مخاوف الأمان في CUID v1:
| الجانب | CUID v1 | CUID v2 |
|---|---|---|
| الخوارزمية | خوارزمية مخصصة | SHA3 + CSPRNG |
| التشفير | لا (قابل للتنبؤ) | نعم (آمن تشفيرياً) |
| الطابع الزمني | مرئي بوضوح | مخفي في الهاش |
| الصيغة | يبدأ بـ 'c' دائماً | بادئة قابلة للتخصيص |
| حزمة npm | cuid | @paralleldrive/cuid2 |
| الطول | 25 حرفاً ثابتة | قابل للتخصيص (24 افتراضي) |
بالنسبة للمشاريع الجديدة، يُوصى باستخدام CUID v2 الذي يوفر ضمانات أمان أقوى مع الحفاظ على سهولة الاستخدام.
حالات الاستخدام الشائعة
أمثلة برمجية
التثبيت والاستخدام الأساسي:
// 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 والقواعد الشائعة:
// 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'استخدام قيد قاعدة البيانات:
-- 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())
}