مولّد CUID
يولد معرفات فريدة مقاومة للتصادم (CUID v1)
CUIDs المولّدة
CUID v1 تنسيق قديم. للمشاريع الجديدة، استخدم CUID2.
ما هو CUID؟
CUID (معرّف فريد مقاوم للتصادم) هو معرّف فريد عالمياً صُمِّم للتطبيقات الأفقية قابلة التوسع.
يبدأ دائماً بالحرف c، يليه طابع زمني وعداد وبصمة مضيف ومقطع عشوائي — وكلها مرمَّزة بـ base36.
تكون المعرّفات آمنة للعناوين وصغيرة الحجم ومقروءة، مما يجعلها مناسبة لمعرّفات قواعد البيانات وعناوين 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())
}