UUID জেনারেটর

আপনার ব্রাউজারে UUID তৈরি করুন: সম্পূর্ণ র্যান্ডম v4, ডাটাবেস কির জন্য সময়-ক্রমবদ্ধ v7, বা নেমস্পেস ও নাম থেকে ডিটারমিনিস্টিক v5। একসঙ্গে ১০০০টি পর্যন্ত তৈরি করুন এবং কোনো ডেটাই আপনার ডিভাইস ছেড়ে যাবে না।

নির্বাচন করতে তৈরি করুন চাপুন
সংস্করণ
উন্নত অপশন

আপনার কি এমন একটি আইডেন্টিফায়ারের প্রয়োজন, যা অন্য কারও তৈরি করা আইডেন্টিফায়ারের সাথে মিলে যাবে না, এমন কোনো মেশিনে যা সম্পর্কে আপনি কখনও শোনেননি, এবং এর জন্য কারও অনুমতির প্রয়োজন হবে না? ঠিক এই কাজটিই একটি UUID করে থাকে। এটি ১২৮-বিটের একটি সংখ্যা, যা পরিচিত 8-4-4-4-12 বিন্যাসে ৩৬টি অক্ষর হিসাবে লেখা হয়, এবং এর সম্পূর্ণ ডিজাইনটি এমন যে কে কোনটি পাবে তা নিয়ে কোনো সমন্বয় না থাকলেও, দুটি UUID কখনই এক হবে না। এই বিনামূল্যের জেনারেটরটি আপনার ব্রাউজারে এগুলো তৈরি করে: "সংস্করণ" থেকে একটি সংস্করণ বেছে নিন, "সংখ্যা" ফিল্ডে বলুন আপনার কতগুলো প্রয়োজন এবং "তৈরি করুন" চাপুন। পৃষ্ঠাটি একটি একক v4 দিয়ে খোলে, যে সংস্করণটি বেশিরভাগ প্রজেক্টে প্রয়োজন হয়, তাই একটি প্রথম আইডেন্টিফায়ার পেতে কেবল একটি ক্লিকই যথেষ্ট।

প্রতিটি আইডেন্টিফায়ার আপনার ব্রাউজার দ্বারা Web Crypto API এর মাধ্যমে তৈরি হয়। সংস্করণ ৪ ব্রাউজার সমর্থন করলে crypto.randomUUID() ব্যবহার করে, নতুবা crypto.getRandomValues() ব্যবহার করে — যা Math.random() এর মতো জাভাস্ক্রিপ্ট ছদ্ম-র্যান্ডম ফাংশনের পরিবর্তে ক্রিপ্টোগ্রাফিকভাবে শক্তিশালী র্যান্ডমনেস সরবরাহ করে। সংস্করণ ৭ এর শুরুতে একটি ৪৮-বিটের মিলিসেকেন্ড টাইমস্ট্যাম্প, তারপর একটি ১২-বিটের কাউন্টার যা একই মিলিসেকেন্ডের মধ্যে বাড়ে, এবং এরপর ৬২টি র্যান্ডম বিট যুক্ত করে, যা RFC 9562 এ বর্ণিত একটি ক্রমানুসারে সাজানোর পদ্ধতি; এই কাউন্টারটির কারণেই একসঙ্গে ১০০০টি UUID এলোমেলো হওয়ার বদলে ক্রমানুসারে তৈরি হয়। সংস্করণ ১ একটি টাইমস্ট্যাম্পকে মাল্টিকাস্ট বিট সেট করা একটি র্যান্ডম নোড আইডেন্টিফায়ারের সাথে একত্রিত করে, তাই এটি ১৯৯০-এর দশকের প্রথম দিকের ইমপ্লিমেন্টেশনের মতো আপনার নেটওয়ার্ক কার্ডের ঠিকানা বহন করে না। সংস্করণ ৩ এবং ৫ মোটেও র্যান্ডম নয়: এগুলো MD5 এবং SHA-1 ব্যবহার করে একটি নেমস্পেস এবং একটি নামকে একসাথে হ্যাশ করে, এবং এই হ্যাশিং প্রক্রিয়াটিও আপনার ডিভাইসেই সম্পন্ন হয়। সার্ভারে কোনো কিছু পাঠানো হয় না, কোনো কিছু লগ করা হয় না এবং পৃষ্ঠাটি একবার লোড হওয়ার পর ইন্টারনেট সংযোগ বিচ্ছিন্ন থাকলেও কাজ করতে থাকে।

"সংস্করণ" হলো সেই ফিল্ড যা অন্য সবকিছু নির্ধারণ করে। সংস্করণ ৪ হলো ১২২টি র্যান্ডম বিট এবং এতে কোনো কাঠামো নেই — এটি ডিফল্ট এবং যখন আইডেন্টিফায়ারকে শুধুমাত্র অদ্বিতীয় হতে হয়, তখন এটিই সঠিক পছন্দ। সংস্করণ ৭-এ ৬২টি র্যান্ডম বিট থাকে কিন্তু এটি তৈরি হওয়ার সময়ের সাথে শুরু হয়, তাই এগুলোর একটি সেট তৈরি হওয়ার ক্রমানুসারে সাজানো যায়; এই কারণেই যখন আইডেন্টিফায়ার একটি ডাটাবেস কি-তে পরিণত হয়, তখন এই সংস্করণটি বেছে নিতে হয়। সংস্করণ ১ হলো মূল সময়-ভিত্তিক স্কিম, যা কেবল সেইসব সিস্টেমের জন্য রাখা হয়েছে যারা এখনও এটি দাবি করে। সংস্করণ ৩ এবং ৫ হলো ভিন্ন ধরনের জুটি: এগুলো ডিটারমিনিস্টিক, অর্থাৎ একই ইনপুট সবসময় একই আইডেন্টিফায়ার তৈরি করে, এবং এগুলো দুটি অতিরিক্ত ফিল্ড নেয় — "নেমস্পেস", যা স্ট্যান্ডার্ড স্পেস DNS, URL, OID এবং X.500 এর মধ্যে একটি হতে পারে অথবা আপনার নিজস্ব একটি "কাস্টম নেমস্পেস (UUID)" হতে পারে, এবং "নাম", যা আইডেন্টিফাই করার স্ট্রিং। v5-কে URL নেমস্পেস এবং https://example.com/a দিলে, আপনি আজ, আগামীকাল এবং অন্য কারও মেশিনেও একই UUID পাবেন। এই কারণেই v3 বা v5 নির্বাচিত হলে "সংখ্যা" অদৃশ্য হয়ে যায়: একটি ডিটারমিনিস্টিক মানের এক হাজার কপি কেবল একই ডিটারমিনিস্টিক মানের এক হাজার কপিই হবে। অন্য সব সংস্করণের জন্য "সংখ্যা" ১ থেকে ১০০০ পর্যন্ত হয়।

চারটি সুইচ ভেতরের ১২৮টি বিট পরিবর্তন না করেই আউটপুটের রূপ পরিবর্তন করে। "বড় হাতের অক্ষর" হেক্সাডেসিমাল ডিজিটগুলোকে ক্যাপিটাল অক্ষরে লেখে, "হাইফেন ছাড়া" কমপ্যাক্ট ৩২-অক্ষরের রূপ দেয় যা কিছু কলাম এবং ফাইলের নাম পছন্দ করে, এবং "কোঁকড়ানো বন্ধনী" মানটিকে { } এর ভেতর রাখে — যে রূপটিকে Windows এবং .NET জগত GUID বলে। "উন্নত অপশন" এর অধীনে, urn:uuid: সেই প্রিফিক্সটি যুক্ত করে যা এটিকে একটি আনুষ্ঠানিক URN এ পরিণত করে; এটি চালু থাকলে "কোঁকড়ানো বন্ধনী" এবং "হাইফেন ছাড়া" অপশন বন্ধ হয়ে যায়, কারণ স্ট্যান্ডার্ডটি ঠিক একটি URN ফর্মের অনুমতি দেয় এবং সেটি হলো হাইফেনযুক্ত ক্যানোনিক্যাল রূপ। আপনি যখন ব্যাচটি কপি করবেন তখন তা কীভাবে যুক্ত হবে তা "কপির ফর্ম্যাট" নির্ধারণ করে: প্রতি লাইনে একটি, কমা দ্বারা আলাদা করা, অথবা প্রতিটি মান উদ্ধৃতি চিহ্নের ভেতর একটি ট্রেইলিং কমা সহ, যা সরাসরি কোডের কোনো অ্যারেতে পেস্ট করা যায়। ফলাফলের নিচে একটি লাইন থাকে যা বিটে র্যান্ডমনেস — v4 এর জন্য ১২২, v7 এর জন্য ৬২ — এবং v7 এর ক্ষেত্রে, ব্যাচের প্রথম আইডেন্টিফায়ারে এনকোড করা টাইমস্ট্যাম্প রিপোর্ট করে, যাতে মানের ভেতরে থাকা সময়টি উহ্য থাকার বদলে দৃশ্যমান হয়। "সব কপি করুন" এবং "ফাইলে সংরক্ষণ করুন" উভয়ই "কপির ফর্ম্যাট" মেনে চলে। "ইতিহাস" আপনার নিজের ব্রাউজারে শেষ ১০টি ব্যাচ সংরক্ষণ করে: একটি ব্যাচ ফিরিয়ে আনতে সেটিতে ক্লিক করুন, একটি এন্ট্রি কপি বা মুছে ফেলুন, অথবা সম্পূর্ণটি পরিষ্কার করুন। "পরিষ্কার করুন" অপশনটি ফলাফল ফাঁকা করে দেয় কিন্তু আপনার সেটিংস অপরিবর্তিত রাখে, এবং ৫০টি আইডেন্টিফায়ারের পর তালিকাটি পঞ্চাশটি সারির বদলে একটি স্ক্রলযোগ্য ব্লকে পরিণত হয়।

এই পৃষ্ঠার সবচেয়ে গুরুত্বপূর্ণ বিষয়টি হলো প্রাইমারি কি হিসেবে v4 এবং v7 এর মধ্যে পার্থক্য, এবং এটি রুচির কোনো বিষয় নয়। ডাটাবেস ইনডেক্সগুলো হলো ক্রমানুসারে সাজানো B-tree, এবং একটি নতুন কি সেই ক্রমানুসারে কোথায় যুক্ত হবে তা নির্ধারণ করে ইনসার্ট করতে কতটা কাজ করতে হবে। একটি v4 কি হলো র্যান্ডম, তাই পরপর ইনসার্টগুলো ইনডেক্সের সম্পর্কহীন কোণায় গিয়ে পড়ে: পূর্ণ পাতাগুলো ভেঙে যায় (page split), ডাটাবেসটি মেমোরিতে গাছের যে অংশগুলো ধরে রাখে তা খুব কমই সেই অংশগুলো হয় যা পরবর্তী ইনসার্টের জন্য প্রয়োজন, এবং ইনডেক্সটি শেষ পর্যন্ত এটি যে সারিগুলোকে নির্দেশ করে তার চেয়ে অনেক বড় এবং খণ্ডিত হয়ে যায়। একটি v7 কি বর্তমান মিলিসেকেন্ড দিয়ে শুরু হয়, তাই পরপর ইনসার্টগুলো ইনডেক্সের ডান দিকের প্রান্তে একে অপরের পাশে পড়ে, যা একটি স্বয়ংক্রিয়ভাবে-বৃদ্ধি পাওয়া পূর্ণসংখ্যা বা অটো-ইনক্রিমেন্টিং ইন্টিজারের প্যাটার্ন এবং ইনডেক্স কাঠামোগুলো এভাবেই তৈরি করা হয়েছিল। এটাই হলো সম্পূর্ণ পার্থক্য: v7 আপনাকে একটি ক্রমানুসারে থাকা কি এর ইনসার্ট আচরণ এনে দেয়, আর সেই বৈশিষ্ট্যটিও বজায় রাখে যার জন্য আপনি প্রথমে UUID বেছে নিয়েছিলেন, সেটি হলো যে কেউ কোনো সার্ভারকে জিজ্ঞাসা না করেই একটি তৈরি করতে পারে। এর মূল্য হলো যে তৈরি করার সময়টি এখন আইডেন্টিফায়ারের ভেতরে পঠনযোগ্য, এবং তা গুরুত্বপূর্ণ কি না সেটি আপনার ডেটা সম্পর্কিত প্রশ্ন, ফরম্যাট সম্পর্কিত নয়।

কোনো কিছুই কখনো একটি UUID এর অনন্যতা পরীক্ষা করে না; এর আকারই এর গ্যারান্টি। কোনো রেজিস্ট্রি নেই, কোনো সার্ভারে রাউন্ড-ট্রিপ নেই, কোনো লুকআপ নেই — একটি জেনারেটর একটি সংখ্যা তৈরি করে এবং তা প্রদান করে, এবং দুটি UUID এর মধ্যে সংঘর্ষ না হওয়ার একমাত্র কারণ হলো এখানে 2^122 সম্ভাব্য v4 মান রয়েছে, যা প্রায় ৫.৩ × ১০^৩৬ এর কাছাকাছি। বার্থডে প্রবলেম (birthday problem) হলো এটি পরিমাপ করার সঠিক উপায়: যেকোনো দুটির মিলে যাওয়ার সমান সম্ভাবনা (৫০%) তৈরি হওয়ার আগে আপনার প্রায় ২.৭ × ১০^১৮ টি আইডেন্টিফায়ারের প্রয়োজন হবে, যার মানে ৮৬ বছর ধরে প্রতি সেকেন্ডে এক বিলিয়ন নতুন UUID। এটি কী প্রতিশ্রুতি দেয় এবং কী দেয় না সে সম্পর্কে সুনির্দিষ্ট হওয়া উচিত। এটি একটি পরিসংখ্যানগত গ্যারান্টি, গাণিতিক নয়, এবং এটি কেবল তখনই কাজ করে যখন অন্তর্নিহিত র্যান্ডমনেসটি আসল হয় — খারাপভাবে সিড করা একটি জেনারেটর, অথবা এর এন্ট্রপি পুলের সাথে ক্লোন করা একটি ভার্চুয়াল মেশিন, একে এমনভাবে ভেঙে দেয় যা ফরম্যাটটি শনাক্ত করতে পারে না। সংস্করণ ৭ বিষয়টি আরও সংকুচিত করে: একটি মাত্র মিলিসেকেন্ডের মধ্যে একটি জেনারেটর কখনোই নিজেকে পুনরাবৃত্তি করতে পারে না, কারণ কাউন্টারটি এলোমেলো হওয়ার পরিবর্তে বৃদ্ধি পায়, এবং স্বাধীন জেনারেটরগুলোর ক্ষেত্রে ৬২টি র্যান্ডম বিট কাজ করে।

একটি UUID হলো একটি আইডেন্টিফায়ার, কোনো পাসওয়ার্ড নয়। সংস্করণ ৪ অনির্দেশ্য, এবং এটি মানুষদের একে একটি গোপন বিষয় হিসেবে বিবেচনা করতে প্রলুব্ধ করে — একটি পাসওয়ার্ড-রিসেট লিঙ্ক, অনুমান করা যায় না এমন URL, একটি সেশন টোকেন, একটি API কি। অনির্দেশ্যতা বাস্তব, কিন্তু গোপনীয়তা হলো একটি মান কীভাবে ব্যবহার করা হয় তার একটি বৈশিষ্ট্য, এবং আইডেন্টিফায়ারগুলোকে ইচ্ছাকৃতভাবেই অসতর্কভাবে পরিচালনা করা হয়: এগুলো URL-এ থাকে, যা ব্রাউজারের ইতিহাস, সার্ভার লগ, রেফারার হেডার এবং অ্যানালিটিক্সে পৌঁছায় এবং চ্যাট মেসেজে পেস্ট করা হয়। অন্য সংস্করণগুলো আরও খারাপ বিকল্প। সংস্করণ ১ এবং সংস্করণ ৭ উভয়ই তৈরি হওয়ার সময়টি এনকোড করে, তাই যে কারও কাছে এটি থাকলে তিনি জানতে পারবেন এটি কখন তৈরি করা হয়েছে এবং এর পাশাপাশি তৈরি করা অন্যান্য সবকিছুকে সংকুচিত করতে পারবেন। সংস্করণ ৩ এবং ৫ উদ্দেশ্যপ্রণোদিতভাবেই ডিটারমিনিস্টিক: একটি ইমেইল ঠিকানার v5 UUID কোনো হ্যাশ করা গোপন বিষয় নয়, এটি এমন একটি মান যা একই ঠিকানা জানা যে কেউ এক সেকেন্ডে গণনা করতে পারে। কোনো কিছুর নামকরণের জন্য একটি UUID ব্যবহার করুন। যখন মানটি অজানা থাকতে হবে, তখন একটি পাসওয়ার্ড জেনারেটর বা গোপনীয়তার জন্য তৈরি কোনো লাইব্রেরি থেকে একটি টোকেন ব্যবহার করুন।

কেন এই UUID জেনারেটরটি বেছে নেবেন?

UUID-গুলো এমন যেকোনো জায়গায় উপস্থিত হয় যেখানে নাম মুক্ত আছে কি না তা নিশ্চিত করার আগেই কিছুকে নামকরণ করতে হয়। অ্যাপ্লিকেশন কোড সেগুলোকে ইনসার্ট করতে যাওয়া সারির জন্য তৈরি করে, যাতে ডাটাবেসে পৌঁছানোর আগেই বস্তুটির একটি পরিচয় থাকে এবং লেখার কাজটি চলার সময়েই ক্লায়েন্ট একে রেফারেন্স করতে পারে। ডিস্ট্রিবিউটেড সিস্টেমগুলো এগুলোর ওপর বেশি নির্ভরশীল: একটি টেবিলে লেখা একাধিক পরিষেবা, বিমানে অফলাইনে রেকর্ড তৈরি করা একটি মোবাইল ক্লায়েন্ট, একটি কিউ (queue) যাকে ইতিমধ্যে প্রসেস করা মেসেজ চিনতে হবে — এদের কেউই একটি শেয়ার করা কাউন্টারের জন্য অপেক্ষা করতে পারে না। সংস্করণ ৫ একটি ভিন্ন প্রয়োজন পূরণ করে, যা হলো আপনার কাছে আগে থেকেই থাকা কিছু থেকে প্রাপ্ত একটি স্থিতিশীল আইডেন্টিফায়ার: একই ডকুমেন্ট, একই URL বা একই অ্যাকাউন্ট সবসময় একই UUID ম্যাপ করে, যাতে কোনো ইমপোর্ট ডুপ্লিকেট না করেই দুইবার চালানো যায়। অন্য কোথাও এগুলো কেবল এমন একটি ফরম্যাট যা কোনো সিস্টেম দাবি করে — লগ এবং ট্রেসের মধ্য দিয়ে যাওয়া একটি কোরিলেশন আইডেন্টিফায়ার, একটি ফাইলের নাম যা হাজার ব্যবহারকারীর আপলোড একই বাকেটে পড়লে সংঘর্ষ করবে না, একটি Windows রেজিস্ট্রি কি, একটি টেস্ট ফিক্সচার যাকে আসল ডেটার মতো দেখতে হতে হবে।

কয়েকটি সৎ সীমাবদ্ধতা জেনে রাখা ভালো। একটি ব্যাচ হলো একটি সংস্করণ: "সংস্করণ" এ থাকা মানটি এর ভেতরে থাকা সবকিছুর ওপর প্রয়োগ হয়, তাই v4 এর একটি রান এবং v7 এর একটি রান হলো দুটি ব্যাচ। এটি একটি জেনারেটর, কোনো পরিদর্শক নয় — এর সংস্করণ বা টাইমস্ট্যাম্প পড়তে একটি UUID পেস্ট করা এই পৃষ্ঠার কাজ নয়। "ফাইলে সংরক্ষণ করুন" CSV বা JSON এর বদলে একটি সাধারণ টেক্সট ফাইল লেখে। সংস্করণ ৭ মিলিসেকেন্ড পর্যন্ত কখন তৈরি করা হয়েছিল তা প্রকাশ্যে উন্মোচন করে, যা একটি বাস্তব বিনিময়, কোনো ত্রুটি নয়, এবং সংস্করণ ১ ঠিক একইভাবে সময় প্রকাশ করে; যদি তা আপনার ডেটার জন্য সমস্যার হয়, তবে সংস্করণ ৪ হলো সেই সংস্করণ যা কাউকে কিছু বলে না। স্ট্যান্ডার্ড থেকে দুটি বিশেষ মান সংস্করণ নয় এবং তাই "সংস্করণ" এ কোনো বিকল্প নয়, তবে আপনি এখান থেকে এগুলো কপি করতে পারেন: nil UUID, 00000000-0000-0000-0000-000000000000, এবং max UUID, ffffffff-ffff-ffff-ffff-ffffffffffff। এই পৃষ্ঠার সবকিছু RFC 9562 অনুসরণ করে, যা ২০২৪ সালে RFC 4122 কে প্রতিস্থাপন করে, তাই আউটপুটটি যেকোনো লাইব্রেরি, ডাটাবেস বা API দ্বারা গৃহীত হয় যা মোটেও UUID পরিচালনা করে। এই সীমাবদ্ধতার ভেতরে গ্যারান্টিটি অনেক শক্তিশালী: প্রতিটি আইডেন্টিফায়ার আপনার নিজের মেশিনে ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত র্যান্ডমনেস থেকে স্ট্যান্ডার্ড অনুসারে তৈরি হয়, এবং অন্য কেউ কখনও এটি দেখতে পায় না।

FAQ

আমি কীভাবে একটি UUID তৈরি করব?

"সংস্করণ" থেকে একটি সংস্করণ বেছে নিন, "সংখ্যা" তে বলুন আপনার কতগুলো প্রয়োজন, এবং "তৈরি করুন" চাপুন। পৃষ্ঠাটি একটি একক সংস্করণ ৪ আইডেন্টিফায়ার দিয়ে খোলে, যা বেশিরভাগ প্রজেক্টে প্রয়োজন হয়, তাই একটি সাধারণ UUID কেবল একটি ক্লিক দূরে। প্রতিটি মান তার নিজস্ব কপি বোতামের সাথে উপস্থিত হয়, এবং "সব কপি করুন" একসাথে পুরো ব্যাচটি নিয়ে নেয়।

UUID v4 এবং v7 এর মধ্যে পার্থক্য কী?

সংস্করণ ৪ হলো ১২২টি র্যান্ডম বিট যার কোনো কাঠামো নেই, তাই দুটির মধ্যে একে অপরের কোনো সম্পর্ক নেই। সংস্করণ ৭ এর প্রথম ৪৮ বিট এটি তৈরি হওয়ার মিলিসেকেন্ডের ওপর ব্যয় করে, একটি কাউন্টার এবং ৬২টি র্যান্ডম বিট যোগ করে, এবং তাই এটি ক্রমানুসারে সাজানো যায়: একটি ব্যাচ তৈরি হওয়ার ক্রমানুসারে বেরিয়ে আসে। আইডেন্টিফায়ার যখন কেবল অনন্য হতে হবে তখন v4 ব্যবহার করুন, এবং যখন এটি একটি ডাটাবেস কি হবে তখন v7 ব্যবহার করুন।

আমার কোন UUID সংস্করণ ব্যবহার করা উচিত?

অন্যটি বেছে নেওয়ার কোনো কারণ না থাকলে সংস্করণ ৪। যদি আইডেন্টিফায়ারটি প্রাইমারি কি হয় এবং ইনসার্ট পারফরম্যান্স গুরুত্বপূর্ণ হয় তবে সংস্করণ ৭ বেছে নিন, যদি আপনার একই ইনপুট থেকে সবসময় একই আইডেন্টিফায়ার প্রয়োজন হয় তবে সংস্করণ ৫, এবং যদি কোনো সিস্টেম আপনার কাছে এটি বিশেষভাবে দাবি করে তবে কেবল সংস্করণ ১ বেছে নিন। সংস্করণ ৩ হলো SHA-1 এর বদলে MD5 যুক্ত সংস্করণ ৫, এবং এটি সামঞ্জস্যের জন্য রয়েছে।

তৈরি করা UUID-গুলো কি সত্যিই র্যান্ডম এবং সুরক্ষিত?

র্যান্ডমনেস ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত: এটি Math.random() থেকে নয়, crypto.randomUUID() বা crypto.getRandomValues() এর মাধ্যমে আপনার ব্রাউজারের Web Crypto API থেকে আসে। অনুমান করা যায় না এমন অর্থে সুরক্ষিত হওয়া এবং গোপনীয়তার অর্থে সুরক্ষিত হওয়া দুটি ভিন্ন প্রশ্ন — একটি UUID হলো একটি আইডেন্টিফায়ার, এবং একে কোনো পাসওয়ার্ড, সেশন টোকেন বা API কি হিসেবে ব্যবহার করা উচিত নয়।

আমি কি একসঙ্গে অনেক UUID তৈরি করতে পারি?

হ্যাঁ, একবারে ১০০০টি পর্যন্ত। "সংখ্যা" সেট করুন এবং "তৈরি করুন" চাপুন; পঞ্চাশটির বেশি মানের ক্ষেত্রে ফলাফল সারির দীর্ঘ তালিকার পরিবর্তে একটি একক স্ক্রলযোগ্য ব্লকে পরিণত হয়। "সব কপি করুন" এবং "ফাইলে সংরক্ষণ করুন" পুরো ব্যাচটি গ্রহণ করে, যা "কপির ফর্ম্যাট" নির্দেশ অনুযায়ী যুক্ত হয় — প্রতি লাইনে একটি, কমা দিয়ে আলাদা করা, অথবা কোনো অ্যারেতে পেস্ট করার জন্য উদ্ধৃতিচিহ্নযুক্ত।

কেন v3 এবং v5 আমাকে প্রতিবার একই UUID দেয়?

কারণ সেগুলোর কাজই এটা। সংস্করণ ৩ এবং ৫ হলো ডিটারমিনিস্টিক: আপনি এদের যে নেমস্পেস এবং নাম দেন এগুলো তা হ্যাশ করে, তাই একই ইনপুটগুলো সবসময় যেকোনো মেশিনে এবং যেকোনো ভাষায় একটি অভিন্ন আইডেন্টিফায়ার তৈরি করে। আপনার আগে থেকে থাকা কোনো কিছু থেকে একটি স্থিতিশীল আইডেন্টিফায়ার পাওয়ার জন্য এগুলো উপকারী, এবং সেগুলোকে নির্বাচন করার সময় "সংখ্যা" লুকিয়ে থাকার কারণও এটাই।

নেমস্পেস এবং নাম কী, এবং আমার কোন নেমস্পেস বেছে নেওয়া উচিত?

এগুলো হলো দুটি ইনপুট যেখান থেকে সংস্করণ ৩ বা সংস্করণ ৫ UUID গণনা করা হয়। "নেমস্পেস" বলে নামটি কী ধরনের জিনিস — হোস্ট নামের জন্য DNS, ঠিকানার জন্য URL, সেইসব ডিরেক্টরি স্কিমগুলোর জন্য OID এবং X.500, অথবা যদি আপনি নিজের একটি নেমস্পেস UUID সরবরাহ করতে চান তবে "কাস্টম", যা কোনো অ্যাপ্লিকেশনের ভেতরে সাধারণ পছন্দ। "নাম" হলো স্ট্রিংটি নিজে। ভিন্ন ভিন্ন নেমস্পেস একই নামের জন্য সম্পূর্ণ আলাদা ফলাফল দেয়, যা তাদের রাখার আসল উদ্দেশ্য।

ডাটাবেসের প্রাইমারি কি এর জন্য UUID v7 কেন v4 এর চেয়ে ভালো?

মানগুলো ইনডেক্সে কোথায় গিয়ে পড়ে তার কারণে। একটি ইনডেক্স ক্রমানুসারে রাখা হয়, এবং একটি র্যান্ডম v4 কি এর যেকোনো জায়গায় পড়ে, তাই ইনসার্টগুলো গাছের চারপাশের পাতাকে বিভক্ত করে এবং মেমোরিতে থাকা অংশগুলো খুব কমই পরের বার প্রয়োজন হয়। একটি v7 কি বর্তমান মিলিসেকেন্ড দিয়ে শুরু হয়, তাই পরপর ইনসার্টগুলো ইনডেক্সের একেবারে শেষে একসাথে পড়ে, যা একটি ক্রমানুসারী ইন্টিজার কি এর আচরণ — অথচ যেকোনো পরিষেবা কোনো কেন্দ্রীয় কাউন্টারকে জিজ্ঞাসা না করেই আইডেন্টিফায়ার তৈরি করতে পারে।

দুটি UUID কি কখনও এক হতে পারে?

নীতিগতভাবে হ্যাঁ, বাস্তবে না, এবং এটি কেন তা জানা মূল্যবান। কোনো কিছুই অনন্যতা যাচাই করে না: সংস্করণ ৪ এ সহজভাবে 2^122 সম্ভাব্য মান রয়েছে, যা প্রায় ৫.৩ × ১০^৩৬ এর কাছাকাছি, এবং একটি একক সংঘর্ষের (collision) সমান সম্ভাবনা হওয়ার আগে আপনার প্রায় ২.৭ × ১০^১৮ টি আইডেন্টিফায়ারের প্রয়োজন হবে — যা ৮৬ বছর ধরে প্রতি সেকেন্ডে এক বিলিয়ন। গ্যারান্টিটি চরম নয় বরং পরিসংখ্যানগত, এবং এটি র্যান্ডমনেস আসল হওয়ার ওপর নির্ভর করে, যে কারণে এই জেনারেটরটি সাধারণ ছদ্ম-র্যান্ডম ফাংশনের পরিবর্তে Web Crypto API ব্যবহার করে।

আমি কি একটি UUID কে পাসওয়ার্ড, API কি বা সেশন টোকেন হিসেবে ব্যবহার করতে পারি?

না, এবং এটিই সবচেয়ে বড় ভুল যা মানুষ করে। একটি সংস্করণ ৪ UUID অনির্দেশ্য, কিন্তু আইডেন্টিফায়ারগুলোকে এমনভাবে পরিচালনা করা হয় যেন সেগুলো সর্বজনীন: এগুলো URL-এ, ব্রাউজার ইতিহাস, সার্ভার লগ, রেফারার হেডার এবং অ্যানালিটিক্সে শেষ হয়। সংস্করণ ১ এবং ৭ অতিরিক্তভাবে এটি কখন তৈরি হয়েছিল তা উন্মোচন করে, এবং সংস্করণ ৩ এবং ৫ যে কেউ ইনপুটগুলো জানলে পুনরায় গণনা করতে পারে। যেকোনো কিছুর জন্য যা গোপন থাকতে হবে, একটি পাসওয়ার্ড জেনারেটর বা গোপনীয়তার জন্য তৈরি কোনো লাইব্রেরি থেকে টোকেন ব্যবহার করুন।

UUID v7 কি এটি কখন তৈরি হয়েছিল তা প্রকাশ করে?

হ্যাঁ, মিলিসেকেন্ড পর্যন্ত, এবং এটি কোনো ভুল নয় বরং ডিজাইনের অংশ — টাইমস্ট্যাম্পটিই v7 কে ক্রমানুসারে সাজানোর যোগ্য করে তোলে। ফলাফলের নিচের লাইনটি আপনাকে ব্যাচের প্রথম মানে এনকোড করা সময়টি দেখায়, যাতে আপনি ঠিক কী প্রকাশ পাচ্ছে তা দেখতে পারেন। সংস্করণ ১ এও টাইমস্ট্যাম্প থাকে। যদি তৈরি হওয়ার সময়টি এমন কিছু হয় যা আপনি প্রকাশ করতে চান না, তবে সংস্করণ ৪ এমন সংস্করণ যাতে কোনো সময় থাকে না।

UUID v1 কি আমার MAC ঠিকানা উন্মোচন করে?

এখানে না। আসল স্কিমটি নোড ফিল্ড হিসেবে মেশিনের নেটওয়ার্ক কার্ড ঠিকানা ব্যবহার করত, যেখান থেকে v1 এর খ্যাতি আসে, কিন্তু স্ট্যান্ডার্ডটি মাল্টিকাস্ট বিট দিয়ে চিহ্নিত একটি র্যান্ডম নোড আইডেন্টিফায়ারেরও অনুমতি দেয়, এবং এই জেনারেটরটি সেটিই তৈরি করে। আপনার হার্ডওয়্যারের ঠিকানা কখনোই পড়া হয় না এবং আউটপুটে কখনোই দেখা যায় না।

বড় হাতের অক্ষর, হাইফেন ছাড়া, কোঁকড়ানো বন্ধনী এবং urn:uuid: কী পরিবর্তন করে?

শুধু প্রদর্শন — ভেতরের ১২৮টি বিট প্রতিটি ফর্মেই হুবহু এক। "বড় হাতের অক্ষর" হেক্স ডিজিটগুলোকে ক্যাপিটাল অক্ষরে প্রিন্ট করে, "হাইফেন ছাড়া" কমপ্যাক্ট ৩২-অক্ষরের সংস্করণটি দেয়, "কোঁকড়ানো বন্ধনী" Windows এবং .NET এর GUID লেখার মতো করে মানটিকে { } এর ভেতর মুড়ে দেয়, এবং urn:uuid: সেই প্রিফিক্সটি যোগ করে যা একে আনুষ্ঠানিক URN করে। urn:uuid: চালু থাকলে অন্য দুটিকে বন্ধ করে দেয়, কারণ স্ট্যান্ডার্ডটি ঠিক একটি URN ফর্ম সংজ্ঞায়িত করে এবং এটি হলো ক্যানোনিক্যাল হাইফেনযুক্ত রূপ।