UUID v2 কী?
UUID v2 হলো DCE Security UUID সংস্করণ, যা Distributed Computing Environment (DCE) স্পেসিফিকেশনের অংশ হিসেবে মানকীকৃত এবং RFC 4122-এ উল্লেখিত। এটি UUID v1 কে প্রসারিত করে টাইমস্ট্যাম্প ক্ষেত্রে একটি POSIX ব্যবহারকারী বা গ্রুপ শনাক্তকারী (UID/GID) এমবেড করে।
গঠনটি UUID v1-এর মতোই, তবে 32-বিট time_low ক্ষেত্রটি একটি 32-বিট লোকাল শনাক্তকারী (যেমন POSIX UID) দিয়ে প্রতিস্থাপিত হয় এবং একটি 1-বাইট local_domain ক্ষেত্র নির্ধারণ করে এটি কোন ধরনের লোকাল ID। এর ফলে টাইমস্ট্যাম্প ছোট হয়ে যায়, যা এর নির্ভুলতা ও অনন্যতার নিশ্চয়তা কমিয়ে দেয়।
UUID v2 আধুনিক সফটওয়্যারে অত্যন্ত বিরল। বেশিরভাগ ডেভেলপারের কখনো এটি তৈরি করার প্রয়োজন হবে না। এই পৃষ্ঠাটি সম্পূর্ণতার জন্য ফরম্যাটটি আলোচনা করে এবং লেগ্যাসি সিস্টেমে পাওয়া UUID v2 মান ডিকোড করতে সহায়তা করে।
UUID v2-এর গঠন
UUID v2-এর অন্য UUID সংস্করণের মতো একই 128-বিট, হাইফেনযুক্ত ফরম্যাট রয়েছে। UUID v1 থেকে ক্ষেত্রগুলো নিম্নরূপে আলাদা:
| ক্ষেত্র | বিট | উদ্দেশ্য |
|---|---|---|
| local_id | 32 | <code>local_id</code> — 32-বিট লোকাল ডোমেন শনাক্তকারী (যেমন <code>/etc/passwd</code> থেকে POSIX UID), UUID v1-এর time_low ক্ষেত্র প্রতিস্থাপন করে |
| time_mid | 16 | <code>time_mid</code> — সংক্ষিপ্ত UUID v1 টাইমস্ট্যাম্পের মধ্যবর্তী 16 বিট |
| time_hi+version | 16 | <code>time_hi_and_version</code> — শীর্ষ 12 টাইমস্ট্যাম্প বিট, সংস্করণ নিবল <code>2</code>-এ সেট করা |
| variant+clock_hi | 8 | <code>clock_seq_hi_and_reserved</code> — ভেরিয়েন্ট বিট এবং ক্লক সিকোয়েন্সের উচ্চ অংশ |
| local_domain | 8 | <code>local_domain</code> — ডোমেন শনাক্তকারী: <code>0</code> = POSIX User (UID), <code>1</code> = POSIX Group (GID), <code>2</code> = Organization |
| node | 48 | <code>node</code> — তৈরিকারী হোস্টের 48-বিট MAC অ্যাড্রেস |
উদাহরণ: 000003e8-92e0-21ef-8000-325096b39f47 — local_id 0x000003e8 = UID 1000, local_domain 0x00 = POSIX User
লোকাল ডোমেনের মান
local_domain বাইট UUID-এ এমবেড করা লোকাল শনাক্তকারীর ধরন নির্দিষ্ট করে:
ডোমেনের মানগুলো DCE স্পেসিফিকেশন দ্বারা সংজ্ঞায়িত। 3–255 মানগুলো সংরক্ষিত। বাস্তবে, পাওয়া UUID v2 মানগুলোতে শুধুমাত্র ডোমেন 0 (Person/UID) সাধারণত দেখা যায়।
কেন UUID v2 বিরলভাবে ব্যবহৃত হয়
তিনটি বৈশিষ্ট্য UUID v2 কে বেশিরভাগ আধুনিক অ্যাপ্লিকেশনের জন্য অব্যবহারিক করে তোলে:
কম নির্ভুল টাইমস্ট্যাম্প রেজোলিউশন
টাইমস্ট্যাম্প 28 বিটে সংক্ষিপ্ত (আনুমানিক 7.2-মিনিট গ্রানুলারিটি)। সেই উইন্ডোর মধ্যে, একই হোস্টে একই local_id ও ডোমেন সহ তৈরি UUID অনন্য নয় — স্পেসিফিকেশন তাদের আলাদা করতে clock_seq ক্ষেত্রের উপর নির্ভর করে, যা প্রতি 7-মিনিট উইন্ডোতে অনন্যতা 64 মানের মধ্যে সীমাবদ্ধ করে।
কোনো স্ট্যান্ডার্ড লাইব্রেরি সমর্থন নেই
UUID v1 ও v4-এর বিপরীতে, বেশিরভাগ UUID লাইব্রেরি UUID v2 সমর্থন করে না। uuid npm প্যাকেজ, Python-এর uuid মডিউল এবং Java-এর java.util.UUID সবই v2 বাদ দেয়। কাস্টম বাস্তবায়ন প্রয়োজন।
POSIX-নির্দিষ্ট সিমান্টিক্স
লোকাল ডোমেন ধারণাটি (UID/GID) স্বভাবতই POSIX-নির্দিষ্ট এবং Windows, এমবেডেড সিস্টেম বা ক্লাউড পরিবেশে অর্থবহভাবে প্রযোজ্য নয় যেখানে POSIX ব্যবহারকারী ID-এর ধারণা অনুপস্থিত।
ঐতিহাসিক প্রেক্ষাপট
UUID v2 নব্বইয়ের দশকের শুরুতে Open Software Foundation-এর Distributed Computing Environment (DCE/RPC)-এর অংশ হিসেবে সংজ্ঞায়িত হয়েছিল। লক্ষ্য ছিল এমন UUID তৈরি করা যা অনুমোদন প্রসঙ্গ বহন করতে পারে — বিশেষত, একটি RPC সার্ভারকে আলাদা প্রমাণীকরণ ধাপ ছাড়াই কলিং ব্যবহারকারীকে সনাক্ত করতে দেওয়া।
DCE নিরাপত্তা মডেলটি একটি একরকম POSIX পরিবেশ ধরে নিয়েছিল যেখানে প্রতিটি নোড একটি ভাগ করা UID/GID নেমস্পেসে অংশগ্রহণ করে। এমবেড করা UID সার্ভারকে ডিরেক্টরি সার্ভিসে রাউন্ড-ট্রিপ ছাড়াই দ্রুত অ্যাক্সেস কন্ট্রোল তালিকা পরীক্ষা করতে দিত।
- ইন্টারনেট একরকম POSIX পরিবেশ থেকে মিশ্র ক্লাউড আর্কিটেকচারের দিকে সরে গেছে
- আধুনিক প্রমাণীকরণ শনাক্তকারীতে এমবেড করা UID-এর পরিবর্তে টোকেন (JWT, OAuth) ব্যবহার করে
- UUID v4 (সম্পূর্ণ র্যান্ডম) এবং UUID v7 (সময়-ক্রমানুসারী) অনন্য শনাক্তকারীর ব্যবহারিক ব্যবহারের ক্ষেত্রগুলো কভার করে
- DCE/RPC নিজেই ব্যাপক ব্যবহার থেকে বাদ পড়েছে
RFC 4122 (2005) DCE স্পেসিফিকেশনের রেফারেন্সের মাধ্যমে UUID v2 অন্তর্ভুক্ত করেছে, তবে ইচ্ছাকৃতভাবে বিস্তারিত জেনারেশন অ্যালগরিদম বাদ দিয়েছে — উল্লেখ করে যে এটি IETF নয়, DCE দ্বারা সংজ্ঞায়িত।
RFC 9562 (2024), যা UUID মান আপডেট করেছে, ঐতিহাসিক সম্পূর্ণতার জন্য UUID v2 ধরে রেখেছে তবে এর POSIX-নির্দিষ্ট প্রকৃতি এবং IETF মানে সম্পূর্ণ জেনারেশন অ্যালগরিদমের অনুপস্থিতি উল্লেখ করা অব্যাহত রেখেছে।
UUID v2 বনাম UUID v1
UUID v2 UUID v1 থেকে উদ্ভূত। এখানে তুলনা করা হয়েছে:
| দিক | UUID v1 | UUID v2 |
|---|---|---|
| টাইমস্ট্যাম্প বিট | 60 বিট (~100ns নির্ভুলতা) | 28 বিট (~7.2-মিনিট নির্ভুলতা) |
| লোকাল শনাক্তকারী | নেই | 32-বিট POSIX UID/GID |
| লোকাল ডোমেন | উপস্থিত নেই | 0=UID, 1=GID, 2=Org |
| নোড ক্ষেত্র | MAC অ্যাড্রেস | MAC অ্যাড্রেস |
| লাইব্রেরি সমর্থন | ব্যাপকভাবে সমর্থিত | বিরলভাবে সমর্থিত |
| মান | RFC 4122 / RFC 9562 | DCE spec (RFC 4122-এ উল্লেখিত) |
| ব্যবহারিক প্রয়োগ | লেগ্যাসি timestamp-ক্রমানুসারী ID (Cassandra) | শুধুমাত্র DCE Security প্রসঙ্গে |
সাধারণ উদ্দেশ্যে UUID v2 UUID v1-এর তুলনায় কিছুই দেয় না এবং প্রায় সব দিক থেকেই নিকৃষ্ট। নতুন উন্নয়নে UUID v2 বেছে নেওয়ার কোনো কারণ নেই।
কোড উদাহরণ
UUID v2-এর স্ট্যান্ডার্ড লাইব্রেরিতে কোনো নেটিভ সমর্থন নেই। নিচের উদাহরণগুলো দেখায় কীভাবে UUID v2 মানের সাথে কাজ করতে হয়:
Python — ম্যানুয়াল বাস্তবায়ন
import uuid, struct, time
def uuid_v2(local_id: int, local_domain: int = 0) -> str:
"""
Generate a DCE Security UUID (v2).
local_domain: 0 = POSIX UID, 1 = POSIX GID, 2 = Org
local_id: 32-bit unsigned integer (e.g. os.getuid())
"""
# Get a v1 UUID for the time and node fields
v1 = uuid.uuid1()
fields = list(v1.fields) # [time_low, time_mid, time_hi_version, clock_seq_hi_variant, clock_seq_low, node]
# Replace time_low with local_id
fields[0] = local_id & 0xFFFFFFFF
# Replace version nibble: clear lower 12 bits of time_hi, set version 2
fields[2] = (fields[2] & 0x0FFF) | 0x2000
# Replace clock_seq_low with local_domain
fields[4] = local_domain & 0xFF
return str(uuid.UUID(fields=tuple(fields)))
import os
print(uuid_v2(os.getuid(), local_domain=0)) # POSIX UID
print(uuid_v2(os.getgid(), local_domain=1)) # POSIX GID
Go — google/uuid
// "github.com/google/uuid" supports DCE (v2) via two helper functions: import "github.com/google/uuid" v2Person := uuid.NewDCEPerson() // v2, local_domain=0, local_id=os.Getuid() v2Group := uuid.NewDCEGroup() // v2, local_domain=1, local_id=os.Getgid() // For most new projects, prefer: v4 := uuid.New() // v4 — random, universally supported v7, _ := uuid.NewV7() // v7 — time-ordered, good for database primary keys
JavaScript — ক্ষেত্র বের করুন
বিদ্যমান UUID v2 স্ট্রিং থেকে local_id ও ডোমেন বের করতে:
// Extracting fields from a UUID v2 string
const uuidStr = '000003e8-1234-2abc-8200-a1b2c3d4e5f6'
// ^^^^^^^^ ^^^^ ^ ^^
// local_id ver variant+clockSeqHi
// ^^ = local_domain (00 = POSIX UID)
const parts = uuidStr.split('-')
const localId = parseInt(parts[0], 16) // → 1000 (0x3e8)
const version = parseInt(parts[2][0], 16) // → 2
const localDomain = parseInt(parts[3].slice(2), 16) // low byte of octet pair
const DOMAIN_NAMES = ['POSIX UID', 'POSIX GID', 'Org']
console.log(`Local ID: ${localId}`) // Local ID: 1000
console.log(`Version: ${version}`) // Version: 2
console.log(`Domain: ${DOMAIN_NAMES[localDomain]}`) // Domain: POSIX UID
google/uuid হলো কয়েকটি মূলধারার লাইব্রেরির একটি যেখানে UUID v2-এর নেটিভ সমর্থন রয়েছে। বেশিরভাগ অন্যান্য (npm uuid, Python-এর uuid মডিউল, Java-এর java.util.UUID) এটি সম্পূর্ণভাবে বাদ দেয়।