RevealTheme logo

تولیدکننده UUID

UUID نسخه ۴ (شناسه‌های یکتای جهانی تصادفی) را تولید کنید. هر کلیک یک نمونه جدید تولید می‌کند.

UUID چیست و چرا نرم‌افزارها از آن استفاده می‌کنند؟

یک UUID (Universally Unique Identifier، که گاهی در زمینه‌های مایکروسافت GUID نامیده می‌شود) یک مقدار ۱۲۸ بیتی است که برای شناسایی موجودیت‌ها بدون نیاز به هماهنگی میان سیستم‌ها استفاده می‌شود. ایده UUID این است که دو برنامه متفاوت، که روی دو دستگاه متفاوت اجرا می‌شوند و از یکدیگر بی‌خبرند، می‌توانند UUID تولید کنند و با اطمینان فرض کنند که هرگز با هم تصادم نخواهند کرد. این ویژگی طراحی سیستم‌های توزیع‌شده را ممکن می‌سازد: می‌توانید به هر سرویسی اجازه دهید شناسه‌ها را به‌صورت محلی و بدون یک شمارنده مرکزی بسازد، پایگاه‌های داده را بدون شماره‌گذاری مجدد ردیف‌ها ادغام کنید و شناسه‌ها را در سمت کلاینت پیش از آنکه سرور حتی درخواست را ببیند، از پیش تولید کنید. UUIDها پنج نسخه متعارف دارند که در RFC 4122 تعریف شده‌اند: v1 (مبتنی بر زمان + آدرس MAC، که زمان ایجاد و هویت دستگاه را لو می‌دهد)، v3 (هش MD5 از یک فضای نام + نام)، v4 (تصادفی، رایج‌ترین)، v5 (هش SHA-1 از یک فضای نام + نام). RFC 9562 نسخه v6 (مرتب‌شده بر اساس زمان، مانند v1 اما بدون لو دادن MAC) و v7 (Unix timestamp + تصادفی، که به‌طور خاص برای کلیدهای اصلی پایگاه داده طراحی شده زیرا به ترتیب زمانی مرتب می‌شود) را افزود. این ابزار UUID نسخه ۴ را با crypto.randomUUID() تولید می‌کند که از تصادفی‌بودن قدرتمند رمزنگارانه سیستم‌عامل زیرین مرورگر استفاده می‌کند، همان منبعی که کلیدهای TLS از آن می‌آیند. خروجی بایت‌به‌بایت با خروجی uuid.uuid4() پایتون، crypto.randomUUID() نود و google/uuid.NewRandom() گو یکسان است.

موارد استفاده رایج

  • کلیدهای اصلی پایگاه‌داده: زمانی که نیاز به ادغام پایگاه‌داده‌ها یا تولید شناسه در سمت کلاینت دارید، جایگزین اعداد صحیح خودافزاینده کنید.

  • شناسه‌های نشست در کوکی‌ها: به‌اندازه‌ی کافی بلند که حدس‌زدن یک شناسه‌ی نشست معتبر با حمله‌ی فراگیر از نظر محاسباتی ناممکن باشد.

  • کلیدهای خنثی‌سازی تکرار (idempotency) برای درخواست‌های API: درخواست را با خیال راحت تکرار کنید؛ سرور بر اساس UUID تکرارها را حذف می‌کند.

  • شناسه‌های بارگذاری فایل: فایل‌های بارگذاری‌شده را با UUID نام‌گذاری کنید تا از تصادم مسیر جلوگیری و از افشای نام فایل اصلی پرهیز شود.

  • شناسه‌های ردیابی توزیع‌شده: هر درخواست یک UUID می‌گیرد که در سراسر سرویس‌ها برای همبستگی گزارش‌ها منتشر می‌شود.

  • شناسه‌های داده‌ی آزمون: تصادفی بودنِ قابل پیش‌بینی برای داده‌ی آزمون، بدون هماهنگ‌کردن شناسه‌ها میان موارد آزمون.

پرسش‌های متداول

v4 به چه معناست؟
نسخه ۴: از ۱۲۲ بیت تصادفی به‌علاوه ۶ بیت ثابت نسخه/گونه تولید می‌شود. سایر نسخه‌ها: v1 مبتنی بر timestamp + MAC است (از آن استفاده نکنید؛ هویت دستگاه و زمان را لو می‌دهد)، v3/v5 هش‌های قطعی از یک فضای نام + نام هستند (برای شناسه‌های مشتق پایدار مفیدند)، v7 تصادفی با پیشوند timestamp است (برای پایگاه‌های داده عالی است زیرا به ترتیب زمانی مرتب می‌شود). برای بیشتر موارد، v4 گزینه پیش‌فرض درست است.
UUIDها واقعاً چقدر یکتا هستند؟
UUIDهای v4 دارای ۱۲۲ بیت مؤثر تصادفی هستند: ۵٫۳×۱۰^۳۶ مقدار ممکن. باید ۲٫۷۱ کوینتیلیون UUID تولید کنید تا به احتمال تصادم ۵۰٪ برسید. برای درک بهتر، اگر یک میلیارد UUID در ثانیه تولید کنید، ۸۵ سال طول می‌کشد تا به آن آستانه برسید. تصادم‌های عملی با یک تولیدکننده اعداد تصادفی خوب رخ نمی‌دهند.
برای کلیدهای اصلی پایگاه داده باید از v4 استفاده کنم یا v7؟
v7 برای پایگاه‌های داده بهتر است. UUIDهای v4 تصادفی هستند، یعنی ردیف‌های جدید به‌طور تصادفی در سراسر شاخص‌های B-tree پراکنده می‌شوند که باعث تورم شاخص و درج‌های کند در مقیاس بزرگ می‌شود. v7 timestamp را در ابتدا قرار می‌دهد، بنابراین UUIDهای جدید همیشه بعد از UUIDهای قدیمی مرتب می‌شوند و الگوهای درج را ترتیبی نگه می‌دارند. PostgreSQL، MySQL و SQL Server از v7 سود می‌برند. اگر کتابخانه شما هنوز از v7 پشتیبانی نمی‌کند، ULIDها جایگزین محبوبی با همان ویژگی هستند.
آیا استفاده از crypto.randomUUID() امن است؟
بله. این در WHATWG مشخص شده و در همه مرورگرهای مدرن از طریق تولیدکننده اعداد تصادفی رمزنگارانه سیستم‌عامل (همان منبعی که کلیدهای TLS از آن می‌آیند) پیاده‌سازی شده است. خروجی غیرقابل پیش‌بینی است و به‌طور یکنواخت در کل فضای UUID v4 توزیع می‌شود.
تفاوت بین UUID و GUID چیست؟
آن‌ها از نظر کارکرد یکسان هستند: GUID اصطلاح مایکروسافت برای همان مفهوم است. قالب بایتی در برخی APIهای مایکروسافت متفاوت است (Guid.ToByteArray() در .NET در سه فیلد اول از ترتیب بایت مختلط استفاده می‌کند)، بنابراین زمانی که قابلیت همکاری اهمیت دارد، مراقب ترتیب بایت باشید. قالب رشته‌ای متعارف (8-4-4-4-12) یکسان است.
آیا می‌توانم یک UUID را برای استفاده در URLها کوتاه کنم؟
بله: ۱۲۸ بیت را به‌جای قالب هگزادسیمال متعارف در Base62 یا Base64 کدگذاری کنید. Base62 به شما ۲۲ کاراکتر می‌دهد؛ Base64 با padding ۲۲ کاراکتر یا در گونه امن برای URL خود ۲۲ کاراکتر می‌دهد. برخی کتابخانه‌ها نیز از قالب‌های «UUID کوتاه» استفاده می‌کنند. بیت‌های زیرین تغییر نمی‌کنند؛ فقط کدگذاری نمایش متفاوت است.
چرا UUID من با همان کاراکترهای UUID دیگری شروع می‌شود؟
این تصادفی است: UUIDهای v4 تصادفی هستند. با مجموعاً ۳۶ کاراکتر هگزادسیمال و تنها ۲۲ کاراکتر هگزادسیمال تصادفی (۴ کاراکتر برای نسخه/گونه رزرو شده و ۴ کاراکتر خط تیره هستند)، هنگام تولید تعداد زیادی، برخی هم‌خوانی‌های پیشوند اجتناب‌ناپذیر است. UUID کامل حتی اگر پیشوندها مطابقت داشته باشند یکتا است.

ابزارهای مرتبط

کدگشای JWT

توکن‌های JSON Web Token (JWT) را فوراً کدگشایی کنید. در مرورگر شما اجرا می‌شود: توکن‌ها هرگز از دستگاه شما خارج نمی‌شوند، پس استفاده از آن با اسرار محیط تولید (production) امن است.

قالب‌بند و اعتبارسنج JSON

JSON را به‌صورت آنلاین قالب‌بندی، اعتبارسنجی و فشرده کنید. کاملاً در مرورگر شما کار می‌کند: داده‌های شما هرگز دستگاهتان را ترک نمی‌کنند.

قالب‌بند XML

اسناد XML را قالب‌بندی و زیبا کنید. مفید برای SOAP، نقشه‌های سایت، فیدهای RSS و فایل‌های پیکربندی.

کدگذار و کدگشای Base64

رشته‌ها را به Base64 کدگذاری یا Base64 را به متن کدگشایی کنید. به حریم خصوصی شما احترام می‌گذارد: در مرورگر شما اجرا می‌شود.

کدگذار و کدگشای URL

متن را به کدگذاری امن برای URL (کدگذاری درصدی) و برعکس تبدیل کنید. مفید برای رشته‌های پرس‌وجو، تغییر مسیرها و جریان‌های OAuth.

کدگذار و کدگشای موجودیت‌های HTML

کاراکترهای خاص را به موجودیت‌های HTML (&، < و غیره) و برعکس تبدیل می‌کند. برای جای‌دادن امن متن در HTML مفید است.