CUID কী?
CUID (Collision-Resistant Unique Identifier) হল একটি ওপেন-সোর্স অ্যালগরিদম যা ডিস্ট্রিবিউটেড সিস্টেমে কেন্দ্রীয় সমন্বয়কারী ছাড়াই অনন্য ID তৈরি করে। সাধারণ UUID-এর বিপরীতে, CUID হরিজন্টালি স্কেলেবল হওয়ার জন্য ডিজাইন করা হয়েছে — একাধিক সার্ভার বা ব্রাউজার ট্যাব স্বাধীনভাবে ID তৈরি করতে পারে, সংঘর্ষের ঝুঁকি ন্যূনতম।
প্রতিটি CUID ছোট হাতের অক্ষর c দিয়ে শুরু হয়, যা ফরম্যাটটি এক নজরে চেনা যায়। বাকি অক্ষরগুলো সব ছোট হাতের আলফানিউমেরিক (base36), তাই CUID URL-নিরাপদ এবং অতিরিক্ত এনকোডিং ছাড়াই সরাসরি URL পাথ সেগমেন্ট বা ডেটাবেজ প্রাথমিক কী হিসেবে ব্যবহার করা যায়।
মূল CUID স্পেসিফিকেশন (v1) Eric Elliott তৈরি করেছিলেন এবং cuid npm প্যাকেজের মাধ্যমে জনপ্রিয় হয়েছিল। এটি এখন CUID v2 দ্বারা প্রতিস্থাপিত, যা ক্রিপ্টোগ্রাফিক নিরাপত্তা প্রদান করে। এই পৃষ্ঠা — এবং উপরের জেনারেটর — CUID v1 ID তৈরি করে, যা প্রোডাকশন কোডবেসে এখনও ব্যাপকভাবে পাওয়া যায়।
CUID-এর গঠন
একটি CUID v1 প্রায় ২৫ অক্ষর দীর্ঘ এবং পাঁচটি সংযুক্ত অংশ নিয়ে গঠিত, প্রতিটি অংশ ভিন্ন ধরনের এনট্রপি বহন করে:
অংশগুলো শুধু একত্রে যুক্ত করা হয় — কোনো বিভাজক নেই। বর্তমান টাইমস্ট্যাম্প মানের উপর নির্ভর করে মোট দৈর্ঘ্য সামান্য পরিবর্তিত হয় তবে প্রায় ২৫ অক্ষরে থাকে।
CUID কীভাবে সংঘর্ষ প্রতিরোধ করে
সংঘর্ষ প্রতিরোধ আসে স্বাধীন এনট্রপির উৎসগুলোকে স্তরে স্তরে সাজানোর মাধ্যমে, যাতে সবচেয়ে খারাপ পরিস্থিতিতেও (প্রতি মিলিসেকেন্ডে হাজার হাজার ID তৈরি অনেক মেশিনে) দুটি অভিন্ন ID-এর সম্ভাবনা অত্যন্ত ক্ষুদ্র থাকে।
CUID বনাম UUID v4
CUID এবং UUID v4 উভয়ই ক্লায়েন্ট-সাইড ID তৈরির জন্য ব্যাপকভাবে ব্যবহৃত। তারা একই সমস্যায় ভিন্ন পদ্ধতি নেয়:
| বৈশিষ্ট্য | CUID v1 | UUID v4 |
|---|---|---|
| ফরম্যাট | c + base36 (~২৫ অক্ষর) | হেক্স গ্রুপ (ড্যাশসহ ৩৬ অক্ষর) |
| সাজানোযোগ্য | প্রায় (টাইমস্ট্যাম্প প্রিফিক্স) | না |
| URL-নিরাপদ | হ্যাঁ (শুধু আলফানিউমেরিক) | বেশিরভাগ (ড্যাশ URL-এ ঠিক আছে) |
| সংঘর্ষ প্রতিরোধ | উচ্চ — টাইমস্ট্যাম্প + কাউন্টার + ফিঙ্গারপ্রিন্ট + র্যান্ডম | উচ্চ — ১২২ বিট র্যান্ডম |
| পূর্বানুমানযোগ্যতা | আংশিক (টাইমস্ট্যাম্প দৃশ্যমান) | নেই (বিশুদ্ধ র্যান্ডম) |
| দৈর্ঘ্য | ~২৫ অক্ষর | ৩৬ অক্ষর |
| সমন্বয় প্রয়োজন | না | না |
নিরাপত্তা-সংবেদনশীল পরিস্থিতিতে UUID v4 নিরাপদ কারণ এটি কোনো সময় তথ্য প্রকাশ করে না। CUID সুবিধাজনক যখন আপনি সাজানোযোগ্য, ছোট এবং হাইফেনমুক্ত ID চান — URL, ফাইলনেম বা লগে রেকর্ড কখন তৈরি হয়েছে তা দ্রুত শনাক্ত করতে কাজে আসে।
CUID v1 বনাম CUID2
CUID স্পেসিফিকেশন উল্লেখযোগ্যভাবে পরিমার্জিত হয়েছে। পার্থক্য বোঝা আপনাকে প্রকল্পের জন্য সঠিক সংস্করণ বেছে নিতে সাহায্য করবে:
| দিক | CUID v1 | CUID v2 |
|---|---|---|
| অ্যালগরিদম | ডিটার্মিনিস্টিক উপাদান | SHA-3 ভিত্তিক, সম্পূর্ণ অস্বচ্ছ |
| ক্রিপ্টোগ্রাফিক | না | হ্যাঁ |
| টাইমস্ট্যাম্প দৃশ্যমান | হ্যাঁ | না |
| ফরম্যাট | "c" দিয়ে শুরু | "c" দিয়ে শুরু (কনফিগারযোগ্য) |
| npm প্যাকেজ | @paralleldrive/cuid (বাতিল) | @paralleldrive/cuid2 |
| দৈর্ঘ্য | ~২৫ অক্ষর | ২৪ অক্ষর (ডিফল্ট, কনফিগারযোগ্য) |
নতুন প্রকল্পের জন্য CUID v2 প্রস্তাবিত। এর SHA-3 ভিত্তিক নির্মাণের মানে আউটপুট অস্বচ্ছ — ID থেকে কোনো টাইমস্ট্যাম্প, কাউন্টার বা ফিঙ্গারপ্রিন্ট বের করা যায় না। CUID v1 শুধুমাত্র তখন ব্যবহার করুন যখন বিদ্যমান ডেটাসেটের সাথে পশ্চাৎ-সামঞ্জস্য প্রয়োজন বা নির্ভরতামুক্ত বাস্তবায়ন চান।
ব্যবহারের ক্ষেত্র
@id কৌশল হিসেবে CUID ব্যবহার করে — @default(cuid()) — এটি JavaScript ইকোসিস্টেমে সবচেয়ে বেশি ব্যবহৃত ID ফরম্যাটগুলোর একটি।কোড উদাহরণ
অফিসিয়াল CUID v2 প্যাকেজ ইন্সটল করুন (প্রস্তাবিত) বা নির্ভরতা ছাড়া একটি ন্যূনতম v1 বাস্তবায়ন লিখুন:
// 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'যদি আপনি v1 অ্যালগরিদমের একটি নির্ভরতামুক্ত 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'Prisma এবং PostgreSQL দিয়ে ডেটাবেজ প্রাথমিক কী হিসেবে CUID ব্যবহার:
-- 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())
}