UUID v3 কী?
UUID v3 হলো একটি নাম-ভিত্তিক UUID সংস্করণ যা RFC 4122-এ সংজ্ঞায়িত। র্যান্ডম ডেটা বা টাইমস্ট্যাম্পের পরিবর্তে, এটি দুটি ইনপুট থেকে নির্ধারিতভাবে UUID তৈরি করে: একটি নেমস্পেস UUID এবং একটি নাম স্ট্রিং। নেমস্পেস + নাম জোড়াটি MD5 দিয়ে হ্যাশ করা হয় এবং ফলাফলের হ্যাশটি UUID হিসেবে ফরম্যাট করা হয়।
UUID v3-এর মূল বৈশিষ্ট্য হলো নির্ধারণযোগ্যতা: একই নেমস্পেস ও নাম যেকোনো মেশিনে, যেকোনো সময়ে সবসময় অভিন্ন UUID তৈরি করে। এটি কন্টেন্ট-অ্যাড্রেসিংয়ের জন্য উপযুক্ত — অর্থবহ নামে চিহ্নিত রিসোর্সগুলোর জন্য স্থিতিশীল শনাক্তকারী তৈরিতে।
UUID v3 তার হ্যাশ ফাংশন হিসেবে MD5 ব্যবহার করে। নিরাপত্তার উদ্দেশ্যে MD5 ক্রিপ্টোগ্রাফিক্যালি ভাঙা হিসেবে বিবেচিত, তাই নতুন ডেভেলপমেন্টে সাধারণত UUID v5 (SHA-1 ব্যবহার করে) পছন্দ করা হয়। v3 বা v5 কোনোটিই কোনো র্যান্ডমনেস প্রদান করে না — এগুলো সম্পূর্ণ নির্ধারিত।
স্ট্যান্ডার্ড নেমস্পেস
RFC 4122 চারটি পূর্ব-নির্ধারিত নেমস্পেস UUID সংজ্ঞায়িত করে। স্ট্যান্ডার্ড নেমস্পেস ব্যবহার করলে ইন্টারঅপারেবিলিটি নিশ্চিত হয় — দুটি স্বাধীন বাস্তবায়ন একই নেমস্পেসে একই নামের জন্য একই UUID v3 তৈরি করবে:
| নেমস্পেস | UUID | ব্যবহার |
|---|---|---|
| DNS | 6ba7b810-9dad-11d1-80b4-00c04fd430c8 | সম্পূর্ণ যোগ্য ডোমেইন নাম (যেমন 'example.com') |
| URL | 6ba7b811-9dad-11d1-80b4-00c04fd430c8 | URL ও URI (যেমন 'https://example.com/resource') |
| OID | 6ba7b812-9dad-11d1-80b4-00c04fd430c8 | ISO অবজেক্ট আইডেন্টিফায়ার (যেমন '1.2.840.113556') |
| X.500 | 6ba7b814-9dad-11d1-80b4-00c04fd430c8 | X.500 ডিস্টিংগুইশড নেম (যেমন 'cn=John,dc=example,dc=com') |
আপনি যেকোনো UUID কাস্টম নেমস্পেস হিসেবেও ব্যবহার করতে পারেন — যেমন একটি UUID v4 যা একবার তৈরি করে আপনার অ্যাপ্লিকেশনে ধ্রুবক হিসেবে এমবেড করুন। এটি আপনার নিজের নাম-থেকে-UUID ম্যাপিংয়ের জন্য একটি প্রাইভেট নেমস্পেস তৈরি করতে দেয়।
UUID v3 বনাম UUID v5
UUID v3 ও UUID v5 কাঠামোগতভাবে অভিন্ন — উভয়ই নির্ধারিত, নাম-ভিত্তিক UUID। পার্থক্য কেবল হ্যাশ ফাংশনে:
- MD5 হ্যাশিং ব্যবহার করে
- 128-বিট আউটপুট (UUID আকারের)
- RFC 4122-এ সংজ্ঞায়িত
- MD5 ক্রিপ্টোগ্রাফিক্যালি ভাঙা
- সব UUID লাইব্রেরিতে সমর্থিত
- SHA-1 হ্যাশিং ব্যবহার করে
- 160-বিট হ্যাশ 128 বিটে সংক্ষিপ্ত
- RFC 4122-এ সংজ্ঞায়িত
- SHA-1 নিরাপত্তায় অবচিত কিন্তু MD5 থেকে শক্তিশালী
- সব UUID লাইব্রেরিতে সমর্থিত
সব নতুন ডেভেলপমেন্টে UUID v3-এর চেয়ে UUID v5 পছন্দ করুন। SHA-1 হ্যাশ MD5 থেকে শক্তিশালী এবং পারফরম্যান্সের পার্থক্য নগণ্য। UUID v3 কেবল তখনই ব্যবহার করুন যখন ইতিমধ্যে এটি ব্যবহার করা কোনো সিস্টেম থেকে UUID পুনরুৎপাদন করা প্রয়োজন।
UUID v3 কখন ব্যবহার করবেন
UUID v3 (এবং v5) উপযুক্ত যখন আপনার একটি অর্থবহ নাম থেকে প্রাপ্ত স্থিতিশীল, পুনরুৎপাদনযোগ্য শনাক্তকারী প্রয়োজন — সংরক্ষণ ও খোঁজ করতে হয় এমন র্যান্ডম ID-এর পরিবর্তে:
নির্ধারণযোগ্যতা বোঝা
UUID v3-এর নির্ধারণযোগ্যতা মানে একটি নির্দিষ্ট আউটপুট: যেকোনো নেমস্পেস UUID এবং যেকোনো নাম স্ট্রিং দিলে UUID সবসময় একই হয় — কোনো র্যান্ডমনেস নেই। এর মানে:
সবসময় তৈরি হয়: 9073926b-929f-31c2-abc9-fad77ae3e8eb
কোনো আক্রমণকারী নেমস্পেস জানলে এবং নাম অনুমান করতে পারলে, সে আগে থেকেই UUID গণনা করতে পারে। UUID v3 মানগুলো কখনো অপ্রত্যাশিত টোকেন, সেশন ID বা সিক্রেট হিসেবে ব্যবহার করা উচিত নয়। নিরাপত্তা-সংবেদনশীল যেকোনো শনাক্তকারীর জন্য UUID v4 ব্যবহার করুন।
কোড উদাহরণ
UUID v3 তৈরিতে একটি নেমস্পেস UUID এবং একটি নাম স্ট্রিং প্রয়োজন। প্রমাণিত uuid প্যাকেজ ব্যবহার করুন:
// Browser / Node.js — UUID v3 without dependencies
function uuidV3(namespace, name) {
// namespace must be a UUID string like '6ba7b810-9dad-11d1-80b4-00c04fd430c8'
const nsBytes = namespace.replace(/-/g, '').match(/../g).map(h => parseInt(h, 16))
const nameBytes = [...new TextEncoder().encode(name)]
const combined = new Uint8Array([...nsBytes, ...nameBytes])
// md5(combined) — use your preferred MD5 library or the inline implementation
const hash = md5(combined) // returns Uint8Array(16)
hash[6] = (hash[6] & 0x0f) | 0x30 // version 3
hash[8] = (hash[8] & 0x3f) | 0x80 // variant
const h = [...hash].map(b => b.toString(16).padStart(2, '0')).join('')
return `${h.slice(0,8)}-${h.slice(8,12)}-${h.slice(12,16)}-${h.slice(16,20)}-${h.slice(20)}`
}
// Using the 'uuid' npm package
import { v3 as uuidv3 } from 'uuid'
const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'
console.log(uuidv3('example.com', uuidv3.DNS))
// → '9073926b-929f-31c2-abc9-fad77ae3e8eb' (always the same)import uuid
# Using the standard library
dns_uuid = uuid.uuid3(uuid.NAMESPACE_DNS, 'example.com')
print(dns_uuid)
# → 9073926b-929f-31c2-abc9-fad77ae3e8eb
url_uuid = uuid.uuid3(uuid.NAMESPACE_URL, 'https://example.com/page')
print(url_uuid)
# Custom namespace
MY_NS = uuid.UUID('a1b2c3d4-e5f6-7890-abcd-ef1234567890')
custom = uuid.uuid3(MY_NS, 'my-entity-name')
print(custom)package main
import (
"fmt"
"github.com/google/uuid"
)
func main() {
// Standard DNS namespace
ns := uuid.MustParse("6ba7b810-9dad-11d1-80b4-00c04fd430c8")
id := uuid.NewMD5(ns, []byte("example.com"))
fmt.Println(id)
// → 9073926b-929f-31c2-abc9-fad77ae3e8eb
// URL namespace
urlNS := uuid.MustParse("6ba7b811-9dad-11d1-80b4-00c04fd430c8")
idURL := uuid.NewMD5(urlNS, []byte("https://example.com/page"))
fmt.Println(idURL)
}