UUID کیا ہے؟
ایک UUID (یونیورسلی یونیک آئیڈنٹیفائر) 128 بٹ کی قدر ہے جو 550e8400-e29b-41d4-a716-446655440000 جیسی 36 حرفی سٹرنگ کے طور پر دکھائی جاتی ہے۔ اس کا فارمیٹ اور ورژن سیمنٹکس v1 تا v5 کے لیے RFC 4122 میں اور نئے v6، v7 اور v8 کے لیے RFC 9562 میں بیان کیے گئے ہیں۔ یہ ٹول v4 (مکمل بے ترتیب)، v1 (ٹائم اسٹیمپ + بے ترتیب نوڈ ID) اور v7 (Unix ملی سیکنڈ ٹائم اسٹیمپ پری فکس + بے ترتیب سفکس، جنریشن کے وقت سے ترتیب پذیر) تیار کرتا ہے — یہ سب آپ کے براؤزر میں پلیٹ فارم کی Web Crypto API کے ذریعے۔ کوئی ڈیٹا کسی سرور کو نہیں بھیجا جاتا۔
UUID جنریشن کیسے کام کرتا ہے؟
ہر ورژن قطعیت، ترتیب پذیری اور انٹروپی کا توازن مختلف انداز میں رکھتا ہے۔ آلہ آپ کے انتخاب کی بنیاد پر صحیح الگورتھم منتخب کرتا ہے:
- v4 (بے ترتیب) براؤزر کے
crypto.randomUUID()کو کال کرتا ہے، جو 122 بٹ کرپٹوگرافک بے ترتیبی واپس کرتا ہے، اور 6 مقرر بٹس (ورژن0100اور variant10) درست مقامات پر سیٹ ہو جاتے ہیں۔ تصادم انتہائی ناقابلِ یقین حد تک کم ہیں — 50% احتمال پر صرف ایک نقل ملنے کے لیے تقریباً 2.71 کوینٹیلین v4 UUID تخلیق کرنے پڑیں گے۔ - v1 (ٹائم اسٹیمپ + نوڈ) 60-بٹ گریگورین ٹائم اسٹیمپ (15-10-1582 سے 100 نینو سیکنڈ کے ٹِکس) کو
time_low/time_mid/time_hi_and_versionمیں رکھتا ہے، ورژن نِبل0001پر سیٹ کرتا ہے، variant بٹس کے ساتھ 14-بٹ clock sequence چنتا ہے، اور 48-بٹ بے ترتیب نوڈ ID استعمال کرتا ہے جس کا multicast بٹ زبردستی آن ہوتا ہے (RFC 4122 §4.5 واضح طور پر اجازت دیتا ہے کہ جب ہارڈویئر MAC دستیاب نہ ہو تو بے ترتیب نوڈ ID استعمال کیا جائے — multicast بٹ اسے غیر-MAC کے طور پر نشان زد کرتا ہے)۔ - v7 (ترتیب پذیر ٹائم اسٹیمپ)، RFC 9562 §5.7 کے مطابق، 48-بٹ big-endian Unix ملی سیکنڈ ٹائم اسٹیمپ، پھر 4-بٹ ورژن
0111، پھر 12 بے ترتیب بٹس، پھر 2-بٹ variant10، پھر مزید 62 بے ترتیب بٹس رکھتا ہے۔ چونکہ ٹائم اسٹیمپ سب سے اہم بٹس میں ہے، v7 UUID جنریشن کی ترتیب میں lexicographically ترتیب پاتے ہیں — یہ خصوصیت کسی اور UUID ورژن میں بغیر اضافی encoding کے دستیاب نہیں۔ - تمام بے ترتیبی
crypto.getRandomValues()سے آتی ہے، یعنی براؤزر کا کرپٹوگرافک طور پر محفوظ RNG۔ v1 اور v7 دونوں میں intra-tick monotonic گارڈ شامل ہے، تاکہ ایک ہی clock tick کے اندر دو مسلسل کالز میں دوسرا قیمت پہلے کے اوپر ہی ترتیب پائے — یہ بلک جنریشن کے لیے اہم ہے جو ملی سیکنڈ گھڑی سے تیز چلتی ہے۔ - جنریشن کے بعد فارمیٹنگ پائپ لائن چلتی ہے۔ آپ ہائفنز ہٹا سکتے ہیں، بڑے حروف میں تبدیل کر سکتے ہیں، قدر کو براؤز میں لپیٹ سکتے ہیں (
{…}— Microsoft GUID کنونشن)، یا خام 16 بائٹس کو base64 (22 حرفی آؤٹ پٹ، بغیر padding) کے طور پر دکھا سکتے ہیں۔ base64 موڈ دیگر فارمیٹ آپشنز کو override کر دیتا ہے کیونکہ base64 بذاتِ خود ایک مکمل نمائندگی ہے۔
یہ UUID جنریٹر کیوں استعمال کریں؟
- کچھ بھی آپ کے براؤزر سے باہر نہیں جاتا۔ Web Crypto API مقامی طور پر چلتی ہے؛ ابتدائی دستاویز لوڈ ہونے کے بعد صفحہ کوئی نیٹ ورک درخواست نہیں بھیجتا۔ DevTools کھولیں، Generate دبائیں، اور Network پینل خاموش رہے گا۔
- RFC کے مطابق آؤٹ پٹ۔ v4 RFC 4122 §4.4 پر، v1 §4.2 اور §4.5 پر، اور v7 RFC 9562 §5.7 پر چلتا ہے۔ ورژن نِبل اور variant بٹس انہی مقامات پر ہیں جہاں معیارات کہتے ہیں — ہر UUID اپنے ورژن کے معیاری ریگیولر ایکسپریشن سے گزر جاتا ہے۔
- ڈیٹابیس کیز کے لیے ترتیب پذیر v7۔ Postgres، MySQL یا SQL Server میں clustered primary key کے طور پر v7 UUID انڈیکس پر append-only ڈالنے دیتا ہے — نہ صفحہ تقسیم، نہ بے ترتیب I/O — اور پھر بھی عالمی طور پر منفرد رہتا ہے۔ v4 ایسا نہیں کر سکتا کیونکہ اس کے بٹس بے ترتیب ہیں۔
- ریٹ کی حد کے بغیر بلک جنریشن۔ ایک وقت میں 1، 10، 100 یا 1,000 UUID بنائیں۔ کوئی کوٹا نہیں، کوئی سائن اپ نہیں — ٹول آپ کے ٹیب میں چلتا ہے، لہٰذا حد آپ کے CPU کی ہے، کسی وینڈر کے API ٹیئر کی نہیں۔
UUID کے عام استعمال کیا ہیں؟
UUIDs ہر اس جگہ کام آتے ہیں جہاں سسٹم کو کسی مرکزی اتھارٹی سے ہم آہنگ کیے بغیر عالمی سطح پر منفرد شناخت کی ضرورت ہو:
- ڈیٹابیس کی پرائمری کیز۔ آٹو-انکریمنٹ انٹیجرز قطار کی تعداد افشا کرتے ہیں اور sharding توڑ دیتے ہیں۔ UUID شارڈز کے درمیان مستحکم، خطوں کے درمیان ضم کرنے میں محفوظ، اور (v7 کے ساتھ) B-tree انسرٹس کو page splits کے بغیر گرم رکھتے ہیں۔ ایک عام ایپلیکیشن UUID کلائنٹ سائیڈ پر بناتی ہے، INSERT میں بھیجتی ہے، اور کبھی بھی کلید کے لیے سرور کا چکر نہیں لگاتی۔
- درخواست کی correlation ID۔ HTTP مڈل ویئر ہر آنے والی درخواست سے ایک v4 UUID منسلک کرتا ہے، ہر span میں اسے لاگ کرتا ہے، اور آگے بھیج دیتا ہے (اکثر
X-Request-Idہیڈر کے طور پر)۔ جب کوئی صارف بگ رپورٹ کرتا ہے، سپورٹ انجینئر ID پیسٹ کرتا ہے اور خدمات اور ٹائم زونز کے پار پوری درخواست کا ٹریس بلا ابہام سامنے آ جاتا ہے۔ - Idempotency کیز۔ ادائیگی APIs (Stripe، Adyen، Square) ایک
Idempotency-Keyہیڈر قبول کرتی ہیں تاکہ دوبارہ بھیجی گئی درخواست کبھی بھی صارف کو دو بار چارج نہ کرے۔ کلائنٹ سے بنایا گیا UUID اس بات کی ضمانت دیتا ہے کہ کلید فی منطقی عمل منفرد ہو — اور یہ بالکل وہی معاہدہ ہے جس کا یہ APIs مطالبہ کرتی ہیں۔
UUID کی مثال کیسی دکھتی ہے؟
Node.js یا کسی جدید براؤزر میں، ایک سطر crypto.randomUUID() ایک تازہ v4 UUID واپس کرتی ہے — مثلاً 3f50b5a8-2c54-4b9c-9c1f-3e5c7e2b8d12۔ اسے درخواست ID یا idempotency کلید کے طور پر استعمال کریں۔ جب UUID ایک ایسے ڈیٹابیس کالم میں جا رہا ہو جو clustered primary key بنے گا، تو v7 بنائیں: ایک ملی سیکنڈ کے فرق سے بنے دو v7 اقدار، جیسے 0190a3b0-7d4f-7c9e-8b21-a4d6f0bd9c11 اور 0190a3b0-7d50-7f15-9c4e-72b3e0c1d8a4، جنریشن کی ترتیب میں lexicographically ترتیب پاتے ہیں۔ Postgres کا uuid ٹائپ دونوں ورژنز کو ایک جیسا محفوظ کرتا ہے — فرق انڈیکس لکھنے کے وقت ظاہر ہوتا ہے، جہاں v7 انسرٹس B-tree کے دائیں جانب append ہوتے ہیں جبکہ v4 انسرٹس بکھر جاتے ہیں اور بے ترتیب I/O پر مجبور کرتے ہیں۔
یہ UUID جنریٹر صرف ایک کام کرتا ہے: ایک کلک کو ایک یا کئی RFC کے مطابق شناخت کنندگان میں بدل دینا، آپ کی پسند کے فارمیٹ میں، آپ کی درخواست کو کسی سرور پر بھیجے بغیر۔ ایک ورژن چنیں، ایک تعداد چنیں، ایک فارمیٹ چنیں — تخلیق کریں، کاپی کریں، اور آگے بڑھیں۔