CUID2 কী?
CUID2 (Collision-resistant Unique ID, সংস্করণ 2) হল CUID v1-এর উত্তরসূরি, যা ডেটাবেস, URL এবং ডিস্ট্রিবিউটেড সিস্টেমে প্রাথমিক কী হিসেবে ব্যবহারের জন্য নিরাপদ — সংক্ষিপ্ত, ক্রিপ্টোগ্রাফিকভাবে নিরাপদ, অস্বচ্ছ আইডি তৈরি করতে ডিজাইন করা হয়েছে।
পূর্ববর্তী সংস্করণের বিপরীতে, CUID2 তৈরির সময়, হোস্ট মেশিন বা জেনারেটিং প্রক্রিয়া সম্পর্কে কোনো তথ্য প্রকাশ করে না। প্রতিটি আইডি একটি র্যান্ডম স্ট্রিং যা একটি এলোমেলো ছোট হাতের অক্ষর দিয়ে শুরু হয় এবং তারপরে SHA-512 থেকে প্রাপ্ত base-36 হ্যাশ থাকে। ডিফল্ট দৈর্ঘ্য 24 অক্ষর, তবে আপনি আপনার স্টোরেজের সীমাবদ্ধতা অনুযায়ী 2 থেকে 32 অক্ষরের মধ্যে যেকোনো দৈর্ঘ্য কনফিগার করতে পারেন।
CUID2 আধুনিক ডেটাবেস টুলকিট দ্বারা ব্যাপকভাবে সুপারিশকৃত। Prisma এটি তার @default(cuid()) স্কেলারের জন্য ডিফল্ট আইডি কৌশল হিসেবে গ্রহণ করেছে, এবং PlanetScale, Neon এবং অন্যান্য সার্ভারলেস ডেটাবেস প্রদানকারীরা স্পষ্টভাবে CUID2-কে পছন্দের আইডি ফরম্যাট হিসেবে তালিকাভুক্ত করেছে, কারণ এটি অটো-ইনক্রিমেন্ট পূর্ণসংখ্যার sequential scan দুর্বলতা এড়ায় এবং UUID-এর চেয়ে ছোট ও বেশি পাঠযোগ্য।
কেন CUID2 CUID v1-কে প্রতিস্থাপন করেছে
Eric Elliott কর্তৃক 2012 সালে প্রকাশিত CUID v1, ক্লায়েন্ট-সাইড আইডি জেনারেশনের জন্য সাধারণ UUID-এর তুলনায় একটি বড় উন্নতি ছিল। তবে, নিরাপত্তা গবেষকরা এর ডিজাইনে দুটি মৌলিক সমস্যা আবিষ্কার করেছিলেন:
- ফিঙ্গারপ্রিন্টিং: প্রতিটি CUID v1 মানে এমবেড করা হোস্ট ফিঙ্গারপ্রিন্ট মেশিন বা প্রক্রিয়া চিহ্নিত করতে ব্যবহার করা যেত, যা আইডি পর্যবেক্ষণকারী যে কেউর কাছে অপারেশনাল মেটাডেটা ফাঁস করত।
- পূর্বানুমানযোগ্যতা: CUID v1 একটি ক্রমবর্ধমান কাউন্টার এবং একটি টাইমস্ট্যাম্প সেগমেন্ট অন্তর্ভুক্ত করত বলে, কিছু আইডি পর্যবেক্ষণকারী আক্রমণকারী ভবিষ্যৎ আইডির আনুমানিক পরিসর অনুমান করতে পারত, যা আইডিকে একমাত্র অনুমোদন পরীক্ষা হিসেবে ব্যবহারকারী API-এর বিরুদ্ধে এনুমারেশন আক্রমণ সক্ষম করত।
- অ-ক্রিপ্টোগ্রাফিক হ্যাশ: CUID v1 একটি সাধারণ অ-ক্রিপ্টোগ্রাফিক হ্যাশিং পদক্ষেপ ব্যবহার করত যা আধুনিক নিরাপত্তা মানদণ্ড পূরণ করত না।
মূল লেখক Eric Elliott আনুষ্ঠানিকভাবে CUID v1 বাতিল করেছেন এবং এই সব সমস্যা সমাধানের জন্য স্ক্র্যাচ থেকে CUID2 তৈরি করেছেন। নতুন অ্যালগরিদম Web Crypto API (SHA-512) ব্যবহার করে এবং সমস্ত নির্ধারণমূলক উপাদান বাদ দেয়, প্রতিটি আইডিকে পরিসংখ্যানগতভাবে অন্য সবার থেকে স্বাধীন করে তোলে।
CUID2 ডিজাইন নীতি
CUID2 বনাম CUID v1 — তুলনা
নিচের টেবিলটি CUID2 এবং এখন-বাতিল CUID v1-এর মধ্যে প্রধান পার্থক্যগুলি সংক্ষিপ্ত করে। আপনি যদি বর্তমানে CUID v1 ব্যবহার করছেন, CUID2-এ মাইগ্রেশন দৃঢ়ভাবে সুপারিশ করা হয়।
| বৈশিষ্ট্য | CUID2 | CUID v1 |
|---|---|---|
| নিরাপত্তা | ক্রিপ্টোগ্রাফিক (SHA-512) | অ-ক্রিপ্টোগ্রাফিক (ফিঙ্গারপ্রিন্ট-ভিত্তিক) |
| পূর্বানুমানযোগ্যতা | অস্বচ্ছ — কোনো মেটাডেটা ফাঁস নেই | Timestamp + ফিঙ্গারপ্রিন্ট আইডিতে দৃশ্যমান |
| দৈর্ঘ্য | কনফিগারযোগ্য (2–32 অক্ষর) | নির্দিষ্ট 25 অক্ষর |
| প্রিফিক্স | এলোমেলো a–z অক্ষর | সর্বদা "c" দিয়ে শুরু |
| বিতরণ | সমতল / অভিন্ন | ক্রমবর্ধমান সেগমেন্ট |
| অবস্থা | সক্রিয়ভাবে রক্ষণাবেক্ষণকৃত | মূল লেখক কর্তৃক বাতিল |
CUID2 বনাম UUID v4 — তুলনা
UUID v4 হল এলোমেলো অনন্য আইডির প্রভাবশালী মান। CUID2 নিরাপত্তা না হারিয়ে UUID v4-এর তুলনায় বেশ কিছু ব্যবহারিক সুবিধা প্রদান করে।
| বৈশিষ্ট্য | CUID2 | UUID v4 |
|---|---|---|
| ডিফল্ট দৈর্ঘ্য | 24 অক্ষর | 36 অক্ষর (হাইফেনসহ) |
| URL-নিরাপদ | হ্যাঁ — ছোট হাতের a–z + 0–9 | এনকোডিং প্রয়োজন (হাইফেন রয়েছে) |
| কাস্টম দৈর্ঘ্য | হ্যাঁ (2–32) | না — সর্বদা 128 বিট / 36 অক্ষর |
| বাছাইযোগ্য | না (ডিজাইন অনুযায়ী) | না (v4 এলোমেলো) |
| এন্ট্রপির উৎস | SHA-512 + Web Crypto | CSPRNG |
| অক্ষর সেট | Base-36 (a–z, 0–9) | Hex + হাইফেন |
মূল ট্রেডঅফ হলো পরিচিতি: UUID v4 হল একটি IETF মান (RFC 4122) যা প্রায় প্রতিটি ডেটাবেস, প্রোগ্রামিং ভাষা এবং API ফ্রেমওয়ার্ক সরাসরি সাপোর্ট করে। CUID2 একটি কমিউনিটি মান যার ক্রমবর্ধমান সমর্থন থাকলেও এটি সর্বজনীন নয়। বাহ্যিক সিস্টেমের সাথে আন্তঃকার্যক্ষমতা যখন সর্বোচ্চ গুরুত্বপূর্ণ তখন UUID v4 বেছে নিন; যখন আপনি উভয় প্রান্ত নিয়ন্ত্রণ করেন এবং ছোট, URL-নিরাপদ আইডি পছন্দ করেন তখন CUID2 বেছে নিন।
CUID2 কে ব্যবহার করে
CUID2 JavaScript এবং TypeScript ইকোসিস্টেম জুড়ে দ্রুত জনপ্রিয় হয়েছে:
- Prisma — সবচেয়ে জনপ্রিয় TypeScript ORM Prisma Schema v2+-এ
@default(cuid())সহ@idফিল্ডের জন্য প্রস্তাবিত ডিফল্ট হিসেবে CUID2 ব্যবহার করে। - PlanetScale — তাদের ডকুমেন্টেশন এবং স্টার্টার টেমপ্লেটগুলি তাদের ডিস্ট্রিবিউটেড MySQL প্ল্যাটফর্মে ক্রমিক স্ক্যানের পারফরম্যান্স সমস্যা এড়াতে অ্যাপ্লিকেশন-জেনারেটেড প্রাথমিক কীগুলির জন্য CUID2 সুপারিশ করে।
- Drizzle ORM — কলাম সংজ্ঞার জন্য একটি অন্তর্নির্মিত
cuid2()ডিফল্ট হেল্পার প্রদান করে। - tRPC boilerplates — অনেক কমিউনিটি tRPC + Prisma স্টার্টার টেমপ্লেট প্রাথমিক কী কৌশল হিসেবে CUID2 সহ আসে।
- T3 Stack — create-t3-app স্ক্যাফোল্ডিং টুল তৈরি করা স্কিমা ফাইলে CUID2 ডিফল্ট সহ Prisma ব্যবহার করে।
কোড উদাহরণ
অফিসিয়াল @paralleldrive/cuid2 npm প্যাকেজ একটি সহজ API প্রদান করে:
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 স্কিমার সাথে CUID2 ব্যবহার করা:
model User {
id String @id @default(cuid())
email String @unique
name String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}npm প্যাকেজ ছাড়াই Node.js-এ CUID2 তৈরি করা (শুধুমাত্র Web Crypto API ব্যবহার করে, যেমন এই টুলটি ব্রাউজারে করে):
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"