مولد دستهای UUID
برای هر شناسه ۱۶ بایت تصادفی رمزنگاری برمیدارد، بیتهای نسخه و واریانت RFC ۹۵۶۲ را جایگزین میکند و تا ۱۰٬۰۰۰ مقدار UUID نسخهٔ ۴ را بهصورت جدولی قابلکپی با یک فایل CSV قابل دانلود ارائه میکند.
UUIDهای تولیدشده
| ۱ | d7542c98-dce5-4ca8-8a36-fb4f421ec793 |
| ۲ | e79427e2-d06c-4883-85b0-28e18de64943 |
| ۳ | 12d075d6-986a-48c8-9896-3ce131ff15ce |
| ۴ | 2fd5ba3d-e5a0-4a75-96a4-302fd1dc1abf |
| ۵ | e97772c2-8524-4c17-899d-41938d1cf24f |
| ۶ | b0cf62f3-fdbf-4e5e-abc5-06089e631e63 |
| ۷ | 8bde81b3-feb5-4daa-a0a1-986c29b54bcf |
| ۸ | 2603ca14-0ca2-4fcb-bbbd-92c3153260d8 |
| ۹ | 18b68e68-8d9e-4ed6-b13f-65028fb7d2fc |
| ۱۰ | 9b8a92c0-39ab-48ca-ad8a-d205a19491f7 |
| ۱۱ | 77a0a13e-ea04-4533-81f9-5a8a71b25c80 |
| ۱۲ | 7f107f6c-df76-47e6-b439-52be7cee4587 |
| ۱۳ | d98e1aad-71b7-43d4-8b61-d4e08d100d31 |
| ۱۴ | 168b6743-2f17-400c-adfa-8323c3edcd74 |
| ۱۵ | e4f619d1-6f26-400a-999e-a2d8db933534 |
| ۱۶ | 367a1870-95a3-4956-8639-3a3ab24d2eee |
| ۱۷ | 716616cf-9c85-4db8-b1f1-e6b7a072a895 |
| ۱۸ | 861701f4-885d-41d0-a014-387854e93c87 |
| ۱۹ | d576c3f4-e8ed-4365-a9be-60d5a73525c5 |
| ۲۰ | daee94d2-6357-4356-aa43-eb9516792c2a |
نتیجهها بدون تضمین درستی ارائه میشوند. روش و منابع در پایین صفحه منتشر شدهاند تا بتوانید محاسبه را بررسی کنید.
چگونگی کار
این ابزار چه چیزی را محاسبه میکند
UUID نسخهٔ ۴ یک شناسهٔ ۱۲۸ بیتی است که محتوایش بهجز شش بیت که چیدمان آن را مشخص میکنند، تصادفی است. مهر زمانی، آدرس دستگاه یا شمارندهٔ پایگاه داده در آن نیست. به همین دلیل سامانههای مستقل میتوانند بدون هماهنگی با یک سرویس مرکزی مقدار تولید کنند.
این ابزار بهجای یک رشتهٔ تزئینی، یک دسته میسازد. هر UUID تولیدشده یک ردیف جدول است، بنابراین نتیجه را میتوان کپی کرد، برای یافتن تکراری بررسی کرد، یا بهصورت CSV دانلود کرد و بهعنوان دادهٔ اولیه، شناسهٔ فیکسچرها یا کلیدهای درونریزی به کار برد.
روش
RFC ۹۵۶۲ به پیادهسازی اجازه میدهد ابتدا همهٔ ۱۲۸ بیت را بردارد و سپس فیلدهای نسخه و واریانت را جایگزین کند. بهصورت اکتتهای با شاخص از صفر:
octet 6 = (random octet 6 AND 00001111) OR 01000000
octet 8 = (random octet 8 AND 00111111) OR 10000000
عبارت اول نیبل بالای اکتت ۶ را به 4 هگزادسیمال وامیدارد. عبارت دوم دو بیت پرارزش اکتت ۸ را به 10 دودویی وامیدارد، بنابراین اولین رقم هگزادسیمال آن 8، 9، a یا b است. همهٔ بیتهای دیگر و بیتهای پایینی که این ماسکها نگه میدارند تصادفی میمانند: در مجموع ۱۲۲ بیت.
Web Crypto هر درخواست getRandomValues را به ۶۵٬۵۳۶ بایت محدود میکند. بزرگترین دسته ۱۶۰٬۰۰۰ بایت دارد، بنابراین پیادهسازی بهجای تکیه بر درخواستی که پلتفرم باید رد کند، تخصیص را در تکههای محدود پر میکند.
پیش از ادامهٔ مطلب
در یک UUID متعارف، کدام جفت رقم آغازین گروه سوم و گروه چهارم هم نسخهٔ ۴ و هم واریانت RFC را درست نشان میدهد؟
گروه سوم با ۴ و گروه چهارم با a. نسخهٔ ۴ نیبل اول گروه سوم را اشغال میکند؛ واریانت RFC بهصورت ۸، ۹، a یا b در ابتدای گروه چهارم دیده میشود.
یک نمونهٔ کارشده از چیدمان بیتها
آزمونها به یک منبع بایت تکرارپذیر نیاز دارند، هرچند مولد واقعی نباید چنین باشد. دادن ۱۶ بایت 00 01 02 ... 0f به الگوریتم نوشتهشده این نتیجه را میدهد:
random: 00010203-0405-0607-0809-0a0b0c0d0e0f
UUIDv4: 00010203-0405-4607-8809-0a0b0c0d0e0f
^ ^
version variant
فقط بیتهای بالای لازم در اکتتهای ۶ و ۸ تغییر کردند. آزمون فرمول آن بردار کامل را تأیید میکند، سپس از منبع واقعی Web Crypto برای ۱۰۰ UUID استفاده میکند و هر مقدار را با دستور زبان نسخه/واریانت میسنجد. آزمون دیگری سقف کامل ۱۰٬۰۰۰ ردیف را تولید میکند و ثابت میکند هیچ درخواست تصادفی از ۶۵٬۵۳۶ بایت فراتر نمیرود.
شکلهای متعارف، فشرده و URN
نمایش آشنا ۳۲ رقم هگزادسیمال را بهصورت 8-4-4-4-12 گروهبندی میکند:
00010203-0405-4607-8809-0a0b0c0d0e0f
متن فشرده چهار خط تیره را حذف میکند. متن URN به مقدار متعارف پیشوند میدهد:
urn:uuid:00010203-0405-4607-8809-0a0b0c0d0e0f
حروف بزرگ، a تا f را به A تا F تبدیل میکند. هیچیک از این عملیات بیتی از UUID را تغییر نمیدهد؛ اینها قراردادهای قالببندی برای سامانهای هستند که فهرست را مصرف میکند.
احتمال برخورد، با بیان صادقانه
2^122 محتوای تصادفی ممکن وجود دارد. برای n UUID با تولید یکنواخت، تقریب روز تولد برای دستکم یک برخورد چنین است:
p ≈ n × (n - 1) / (2 × 2^122)
برای ۱۰٬۰۰۰ مقدار این رقم تقریباً ۹٫۴ × ۱۰^-۳۰ است. ناچیز به معنای صفر نیست و مولد رمزنگاری همچنان یک وابستگی پیادهسازی است. شمارندهٔ تکراریهای جدول، تکرار درون همین دسته را میگیرد، در حالی که قید یکتایی پایگاه داده مرجع نهایی درست در همهٔ دستهها و سامانهها باقی میماند.
کاری که انجام نمیدهد
مقادیر UUID نسخهٔ ۷ مرتب بر حسب زمان، مقادیر UUID نسخهٔ ۵ قطعی مبتنی بر نام، یا کدگذاریهای دودویی مخصوص پایگاه داده تولید نمیکند. همچنین قول نمیدهد که یک UUID محرمانه، امضاشده یا مقاوم در برابر دستکاری باشد. تنها کارش یک دستهٔ استاندارد از شناسههای نسخهٔ ۴ با تصادفیسازی رمزنگاری است.
مراحل انجام کار
- اندازهٔ دسته را بهصورت عددی صحیح از ۱ تا ۱۰٬۰۰۰ اعتبارسنجی کنید. برای هر UUID ۱۶ بایت اختصاص دهید و آنها را از Web Crypto در فراخوانیهایی نه بزرگتر از سهمیهٔ ۶۵٬۵۳۶ بایتی آن پر کنید.
- در اکتت ۶، چهار بیت تصادفی پایین را نگه دارید و چهار بیت بالا را با ۰۱۰۰، یعنی فیلد نسخهٔ ۴، جایگزین کنید. در اکتت ۸، شش بیت تصادفی پایین را نگه دارید و دو بیت بالا را با ۱۰، یعنی واریانت RFC، جایگزین کنید.
- ۱۶ اکتت را بهصورت ۳۲ رقم هگزادسیمال بنویسید. شکل متعارف خط تیرهها را در گروهبندی ۸-۴-۴-۴-۱۲ درج میکند؛ شکل فشرده آنها را حذف میکند؛ URN پیشوند urn:uuid را اضافه میکند. بزرگی و کوچکی حروف هیچ بیتی را تغییر نمیدهد.
- مقادیر متعارف را درون دستهٔ فعلی مقایسه کنید و هر تکراری را که واقعاً دیده شده گزارش دهید. هر مقدار را بهصورت یک ردیف نتیجهٔ ثابت ارائه دهید که بتوان آن را کپی یا بهصورت CSV دانلود کرد.
فرضها
- هر UUID از بایتهای تصادفی رمزنگاری مرورگر شروع میشود، نه از Math.random و نه از seed قابلمشاهده برای کاربر. شش بیت ساختاری، ۱۲۲ بیت تصادفی در هر مقدار باقی میگذارند.
- UUIDهای تصادفی برخورد را فوقالعاده بعید میکنند؛ اما ضمانت ریاضی یکتایی نمیدهند. شمار تکراریهای دسته یک مشاهده است، نه اثباتی در برابر مقداری که جای دیگری تولید شده.
- UUIDها شناسه هستند، نه رازهای احراز هویت. RFC ۹۵۶۲ میگوید نباید فرض کرد حدس زدن آنها دشوار است یا صرفِ در اختیار داشتن آنها را مجوز دسترسی دانست.
- مقادیر تولیدشده در URL قرار نمیگیرند، در تنظیمات کاتالوگ ذخیره نمیشوند و به سرور فرستاده نمیشوند. محاسبهٔ دوباره عمداً دستهٔ جدیدی تولید میکند.
پرسشهای رایج
آیا UUIDهای تولیدشده در این صفحه به سرور فرستاده میشوند؟
خیر. Web Crypto بایتهای تصادفی را در همین مرورگر پر میکند، بیتهای نسخه و واریانت بهصورت محلی تنظیم میشوند و جدول فقط در نتیجهٔ رندرشده وجود دارد. اگر استفادهٔ عادی از ابزار درخواستی به مبدأ دیگری بفرستد، آزمون مرورگری تولیدشده شکست میخورد.
یک UUID نسخهٔ ۴ چند بیت تصادفی دارد؟
۱۲۲ بیت. یک UUID در مجموع ۱۲۸ بیت دارد؛ چهار بیت نسخهٔ ۴ و دو بیت واریانت RFC را مشخص میکنند. RFC ۹۵۶۲ ۱۲۲ بیت دیگر را به دادهٔ تصادفی اختصاص میدهد.
آیا ممکن است دو مقدار UUID نسخهٔ ۴ یکسان باشند؟
در اصل بله، چون تولید تصادفی است، اما فضا ۲^۱۲۲ حالت دارد. این احتمال در اندازههای دستهٔ معمولی بسیار ناچیز میماند و این صفحه اگر تکراریای درون فهرست فعلی رخ دهد آن را گزارش میکند.
آیا متن فشرده یا با حروف بزرگ UUID شناسهٔ متفاوتی است؟
خیر. خط تیرهها، بزرگی و کوچکی حروف هگزادسیمال و پیشوند urn:uuid نمایشهایی پیرامون همان ۱۲۸ بیت هستند. از شکلی استفاده کنید که پایگاه داده یا API دریافتکننده انتظار دارد.
آیا میتوان UUID نسخهٔ ۴ را بهعنوان کلید API یا گذرواژه به کار برد؟
خیر. RFC ۹۵۶۲ بهصراحت هشدار میدهد که نباید فرض کرد حدس زدن UUIDها دشوار است یا در اختیار داشتن آنها را مجوز دسترسی دانست. یک راز اختصاصی با طول و قواعد نگهداری مناسب احراز هویت تولید کنید.