پرش به محتوا

تولیدکننده UUID رایگان - ایجاد UUID های V1 و V4 در لحظه

تولید شناسه‌های منحصر به فرد در لحظه با تولیدکننده UUID رایگان ما. ایجاد UUID نسخه 1 (مبتنی بر زمان) و نسخه 4 (تصادفی) برای پایگاه‌های داده، API ها و سیستم‌های توزیع شده.

تولیدکننده UUID

نسخه UUID
UUID تولید شده
ماشین حساب بارگذاری...
📚

مستندات

مولد UUID

مولد UUID ابزاری است که یک شناسهٔ یکتای سراسری، یا UUID، ایجاد می‌کند: کدی ۱۲۸-بیتی که برای برچسب‌گذاری یک داده به کار می‌رود تا احتمال بسیار کمی داشته باشد مورد دیگری در هیچ‌جا همان برچسب را داشته باشد. این صفحه UUIDهای نسخهٔ ۱ (مبتنی بر زمان) و نسخهٔ ۴ (تصادفی) را ایجاد می‌کند.

UUID چیست؟

UUID عددی ۱۲۸-بیتی است که به‌صورت ۳۲ رقم هگزادسیمال (کاراکترهای ۰–۹ و a-f) نوشته می‌شود. این عدد به پنج گروه تقسیم می‌شود که با خط تیره از هم جدا شده‌اند و الگوی آن ۸-۴-۴-۴-۱۲ است؛ در مجموع ۳۶ کاراکتر دارد. یک UUID نمونه به این شکل است:

1550e8400-e29b-41d4-a716-446655440000
2

UUIDها در RFC ۹۵۶۲ تعریف شده‌اند؛ این RFC را کارگروه مهندسی اینترنت در مه ۲۰۲۴ منتشر کرد و جایگزین RFC قدیمی‌تر ۴۱۲۲ از سال ۲۰۰۵ شد. هر دو سند همان قالب ۱۲۸-بیتی را توصیف می‌کنند. نرم‌افزار از UUIDها برای شناسایی سطرهای پایگاه داده، فایل‌ها، نشست‌های کاربر و دیگر رکوردها استفاده می‌کند، بی‌آنکه مرجع مرکزی لازم باشد شماره‌ها را اختصاص دهد. چون فضای UUIDهای ممکن بسیار بزرگ است، دو رایانه می‌توانند مستقل از هم و در یک لحظه UUID تولید کنند و تقریباً هرگز UUID یکسانی نسازند.

قالب و ساختار UUID

۱۲۸ بیت UUID به فیلدهای نام‌گذاری‌شده تقسیم می‌شود. هر فیلد تعداد ثابتی بیت را دربر می‌گیرد:

  • time_low — ۳۲ بیت
  • time_mid — ۱۶ بیت
  • time_hi_and_version — ۱۶ بیت
  • clock_seq_hi_and_reserved — ۸ بیت
  • clock_seq_low — ۸ بیت
  • node — ۴۸ بیت
چیدمان فیلدهای UUID time_low time_mid time_hi seq_hi seq_lo node time_low: 32 bits time_mid: 16 bits time_hi_and_version: 16 bits clock_seq_hi_and_reserved: 8 bits clock_seq_low: 8 bits node: 48 bits

چهار بیت درون time_hi_and_version شمارهٔ نسخهٔ UUID را نگه می‌دارند و دو بیت درون clock_seq_hi_and_reserved گونه را نگه می‌دارند؛ گونه به نرم‌افزار می‌گوید باقی فیلدها را چگونه بخواند. هشت نسخه تعریف شده است.

نام فیلدهای بالا از نسخهٔ ۱ می‌آید؛ در آن نسخه این فیلدها واقعاً مقدار زمان و گره را نگه می‌دارند. نسخه‌های دیگر همان چیدمان ۸-۴-۴-۴-۱۲ و همان مرزهای فیلدها را حفظ می‌کنند، اما بیشتر بیت‌ها را با دادهٔ تصادفی پر می‌کنند. در UUID نسخهٔ ۴، گروه برچسب‌خوردهٔ time_low تصادفی است، نه زمانی.

نحوهٔ تولید UUID با این ابزار

  1. یک نسخه را انتخاب کنید: نسخهٔ ۱ (مبتنی بر زمان) یا نسخهٔ ۴ (تصادفی).
  2. UUID را از کادر نتیجه بخوانید. به‌محض بارگیری صفحه یا تغییر نسخه، UUID جدیدی ظاهر می‌شود.
  3. برای ایجاد UUID دیگر، «تولید» را انتخاب کنید.
  4. برای کپی‌کردن نتیجه در کلیپ‌بورد، «کپی» را انتخاب کنید؛ سپس آن را در کد، پایگاه داده یا فایل پیکربندی جای‌گذاری کنید.

پنل زیر نتیجه، UUID را به پنج فیلد آن تقسیم می‌کند و نام هر فیلد را نشان می‌دهد؛ بنابراین رقم نسخه و رقم گونه به‌راحتی پیدا می‌شوند.

نسخهٔ ۴ برای بیشتر کاربردها، از جمله کلیدهای پایگاه داده و توکن‌های نشست، مناسب است؛ زیرا اطلاعاتی دربارهٔ زمان یا مکان ایجادشدن خود ندارد. نسخهٔ ۱ برای رکوردهایی مناسب است که زمان ایجادشان باید از خود شناسه بازیابی شود، مانند ورودی‌های گزارش.

نسخهٔ ۱ UUID در برابر نسخهٔ ۴

نسخهٔ ۱ مهر زمانی جاری را همراه با یک توالی ساعت و مقدار گرهٔ تصادفی رمزگذاری می‌کند. استاندارد اجازه می‌دهد مقدار گره، نشانی واقعی شبکهٔ رایانه (MAC) باشد، اما استفاده از مقدار گرهٔ تصادفی را نیز به‌عنوان گزینه‌ای برای حفظ حریم خصوصی مجاز می‌داند. این ابزار همیشه از گزینهٔ تصادفی استفاده می‌کند: UUIDهای نسخهٔ ۱ آن هرگز نشانی واقعی MAC را نمی‌خوانند یا آشکار نمی‌کنند. استاندارد همچنین لازم می‌داند کم‌ارزش‌ترین بیت نخستین بایت فیلد گره در مقدار گرهٔ تصادفی روی ۱ تنظیم شود و این ابزار نیز آن را تنظیم می‌کند. کارت‌های شبکهٔ واقعی هرگز این بیت را تنظیم‌شده ندارند؛ بنابراین گرهٔ تصادفی را نمی‌توان با گرهٔ واقعی اشتباه گرفت. به همین دلیل، دومین رقم هگزادسیمال گروه پنجم در UUID نسخهٔ ۱ این صفحه همیشه فرد است: ۱، ۳، ۵، ۷، ۹، b، d یا f.

مهر زمانی در UUID نسخهٔ ۱ قابل بازیابی است؛ بنابراین رکوردها را می‌توان بر اساس زمان ایجاد مرتب کرد. مرتب‌سازی خود متن UUID این کار را انجام نمی‌دهد، زیرا گروه نخست ۳۲ بیت کم‌ارزش‌تر مهر زمانی را نگه می‌دارد و این بیت‌ها تقریباً هر ۷ دقیقه سرریز می‌شوند. نسخهٔ ۶ که در RFC ۹۵۶۲ افزوده شد، همان مهر زمانی را با بیت‌های پرارزش‌تر در ابتدا ذخیره می‌کند تا مرتب‌سازی متن ساده کار کند.

نسخهٔ ۴ از بیت‌های تصادفی ساخته می‌شود و چند بیت برای نشان‌دادن نسخه و گونه از پیش ثابت شده‌اند. این نسخه مهر زمانی یا دادهٔ ویژهٔ ماشین ندارد؛ بنابراین چیزی دربارهٔ زمان یا مکان ایجاد خود فاش نمی‌کند. بر اساس زمان ایجاد قابل مرتب‌سازی نیست.

شش نسخهٔ دیگر در استاندارد وجود دارند، اما این ابزار آن‌ها را تولید نمی‌کند: نسخهٔ ۲ (امنیت DCE، با کاربرد نادر)؛ نسخه‌های ۳ و ۵ که با درهم‌سازی فضای نام و نام با MD5 یا SHA-1 ساخته می‌شوند، به‌گونه‌ای که ورودی یکسان همیشه UUID یکسانی تولید می‌کند؛ و نسخه‌های ۶، ۷ و ۸ که RFC ۹۵۶۲ در (۲۴٬۳۰۰ cm) ۲۰۲۴ برای شناسه‌های قابل مرتب‌سازی و سفارشی افزوده است.

نحوهٔ محاسبهٔ UUID (فرمول)

نسخهٔ ۴:

  1. ۱۲۸ بیت تصادفی تولید کنید.
  2. چهار بیت نسخه، یعنی نخستین رقم هگزادسیمال گروه سوم، را روی 0100 (هگزادسیمال 4) تنظیم کنید.
  3. دو بیت پرارزش گروه چهارم را روی 10 تنظیم کنید؛ در نتیجه نخستین رقم هگزادسیمال آن گروه 8، 9، a یا b خواهد بود.

فقط ۱۲۲ بیت از ۱۲۸ بیت واقعاً تصادفی هستند، زیرا ۶ بیت در گام‌های ۲ و ۳ ثابت می‌شوند. این مقدار 2^122، یعنی تقریباً 5.3 × 10^36، UUID نسخهٔ ۴ ممکن ایجاد می‌کند.

نسخهٔ ۱:

  1. زمان جاری را به‌صورت تعداد بازه‌های زمانیِ ۱۰۰ نانوثانیه از ۱۵ اکتبر ۱۵۸۲، تاریخ اصلاح تقویم گریگوری، در نظر بگیرید. در عمل، این مقدار از جمع زمان معمول یونیکس برحسب میلی‌ثانیه و ۱۲٬۲۱۹٬۲۹۲٬۸۰۰٬۰۰۰ به دست می‌آید و سپس در ۱۰٬۰۰۰ ضرب می‌شود.
  2. آن شمارش ۶۰-بیتی را میان سه فیلد تقسیم کنید: ۳۲ بیت کم‌ارزش‌تر در time_low، ۱۶ بیت بعدی در time_mid و ۱۲ بیت پرارزش‌تر در time_hi_and_version قرار می‌گیرند.
  3. یک توالی ساعت ۱۴-بیتی تولید کنید که برای جلوگیری از برخورد هنگام تنظیم ساعت سیستم به سمت عقب به کار می‌رود.
  4. یک مقدار گرهٔ ۴۸-بیتی تولید کنید و کم‌ارزش‌ترین بیت نخستین بایت آن را روی ۱ تنظیم کنید.
  5. بیت‌های نسخه را روی 0001 و بیت‌های گونه را روی 10 تنظیم کنید.

در همهٔ نسخه‌های UUID، فضای کامل ۱۲۸-بیتی شامل 2^128، یعنی تقریباً 3.4 × 10^38، مقدار ممکن است. این تعداد آن‌قدر زیاد است که برخوردهای تصادفی در عمل نگران‌کننده نیستند.

مثال حل‌شده

خواندن UUID نسخهٔ ۴. نمونهٔ قبلی را در نظر بگیرید: 550e8400-e29b-41d4-a716-446655440000.

  • گروه سوم، 41d4: رقم نخست 4 است و نشان می‌دهد این UUID نسخهٔ ۴ است.
  • گروه چهارم، a716: رقم نخست، a (دودویی 1010)، با 10 آغاز می‌شود که بیت‌های گونهٔ موردنیاز هستند.
  • رقم‌های هگزادسیمال باقی‌مانده، دادهٔ تصادفی هستند.

برنامه‌ای که این UUID را می‌خواند، الگوی 4 و 10 را برای تأیید قالب بررسی می‌کند و سپس با باقی مقدار مانند یک مقدار تصادفیِ غیرقابل تفسیر رفتار می‌کند.

ساخت UUID نسخهٔ ۱. فرض کنید ساعت ۱٬۷۰۰٬۰۰۰٬۰۰۰٬۰۰۰ میلی‌ثانیه از زمان یونیکس را نشان می‌دهد که برابر است با ۱۴ نوامبر ۲۰۲۳، ساعت 22:13:20 به وقت UTC.

  1. جابه‌جایی را اضافه کنید: ۱٬۷۰۰٬۰۰۰٬۰۰۰٬۰۰۰ + ۱۲٬۲۱۹٬۲۹۲٬۸۰۰٬۰۰۰ = ۱۳٬۹۱۹٬۲۹۲٬۸۰۰٬۰۰۰ میلی‌ثانیه.
  2. برای به‌دست‌آوردن بازه‌های ۱۰۰ نانوثانیه‌ای، در ۱۰٬۰۰۰ ضرب کنید: 139,192,928,000,000,000. این مقدار در مبنای شانزده برابر است با 01EE833B04AFC000.
  3. آن را برش دهید: time_low = 04AFC000 (کم‌ارزش‌ترین ۸ رقم هگزادسیمال)، time_mid = 833B (۴ رقم بعدی) و ۱۲ بیت پرارزش‌تر برابر 1EE هستند.
  4. رقم نسخهٔ 1 را پیش از 1EE قرار دهید؛ حاصل time_hi_and_version = 11EE است.

UUID در این صورت به شکل 04afc000-833b-11ee- خوانده می‌شود و پس از آن توالی ساعت و مقدار گره می‌آیند. نرم‌افزار می‌تواند این چهار گام را معکوس کند تا ۱۴ نوامبر ۲۰۲۳ را از شناسه بازیابی کند.

کاربردهای رایج UUID

  • کلیدهای اصلی در پایگاه‌های داده، به‌ویژه زمانی که چندین کارساز هم‌زمان رکورد ایجاد می‌کنند، بدون اینکه با یکدیگر هماهنگ شوند.
  • توکن‌های نشست و کلیدهای API، معمولاً با نسخهٔ ۴ به دلیل حفظ حریم خصوصی.
  • شناسه‌های فایل‌ها، رویدادها و منابع در سیستم‌های توزیع‌شده مانند ریزخدمت‌ها.
  • شناسهٔ دستگاه‌ها در شبکه‌های بزرگ اینترنت اشیا، که در آن هر دستگاه می‌تواند شناسهٔ خود را به‌صورت آفلاین تولید کند.

هزینهٔ اصلی این انتخاب، اندازه است: UUID به ۱۶ بایت فضای ذخیره‌سازی نیاز دارد، درحالی‌که یک شمارندهٔ صحیح ساده به ۴ یا ۸ بایت نیاز دارد؛ همچنین بعضی پایگاه‌های داده UUIDها را کندتر از اعداد صحیح ترتیبی نمایه‌سازی می‌کنند.

جایگزین‌های UUID

اعداد صحیحِ خودافزا کوچک‌تر و ساده‌ترند، اما وقتی بیش از یک کارساز نیاز دارد شناسه‌ها را مستقل اختصاص دهد، عملکرد خوبی ندارند. شناسه‌های Snowflake که در توییتر توسعه داده شدند، مهر زمانی را با شناسهٔ کارگر ترکیب می‌کنند تا در یک سیستم توزیع‌شده شناسه‌هایی فشرده و قابل مرتب‌سازی تولید کنند. ULIDها (شناسه‌های یکتای سراسری قابل مرتب‌سازی واژگانی) قالب جدیدتری هستند که برای تصادفی‌بودن و مرتب‌شدن بر اساس زمان ایجاد طراحی شده‌اند، برخلاف UUID استاندارد نسخهٔ ۴.

تاریخچهٔ استاندارد UUID

مفهوم UUID در دههٔ ۱۹۸۰ در شرکت Apollo Computer و به‌عنوان بخشی از سیستم محاسبات شبکه‌ای آن آغاز شد. بنیاد نرم‌افزار باز بعداً این قالب را برای محیط محاسبات توزیع‌شدهٔ خود پذیرفت. کارگروه مهندسی اینترنت RFC ۴۱۲۲ را در (۱۰٬۵۰۰ cm) ۲۰۰۵ منتشر کرد و در مه ۲۰۲۴ آن را با RFC ۹۵۶۲ جایگزین کرد. RFC ۹۵۶۲ همهٔ نسخه‌های قبلی را بدون تغییر قابل استفاده نگه می‌دارد و نسخه‌های ۶، ۷ و ۸ را می‌افزاید.

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

مولد UUID برای چه کاری استفاده می‌شود؟ این ابزار برای پایگاه‌های داده، سیستم‌های توزیع‌شده، توکن‌های نشست، کلیدهای API و شناسه‌های دستگاه، شناسه‌های یکتا ایجاد می‌کند تا هیچ دو رکوردی مجبور نباشند شناسهٔ یکسانی داشته باشند.

تفاوت UUID نسخهٔ ۱ و نسخهٔ ۴ چیست؟ نسخهٔ ۱ مهر زمانی‌ای را رمزگذاری می‌کند که نرم‌افزار می‌تواند آن را بخواند و زمان ایجاد را بازیابی کند. نسخهٔ ۴ کاملاً تصادفی است و مهر زمانی ندارد. خروجی نسخهٔ ۱ این ابزار به‌جای نشانی واقعی MAC از مقدار گرهٔ تصادفی استفاده می‌کند؛ بنابراین اطلاعات شناسایی‌کنندهٔ ماشین را نیز آشکار نمی‌کند.

آیا نسخهٔ ۱ نشانی MAC من را آشکار می‌کند؟ با این ابزار، خیر. استاندارد اجازه می‌دهد فیلد گرهٔ UUID نسخهٔ ۱ یک نشانی واقعی MAC را نگه دارد، اما این مولد همیشه آن فیلد را با بیت‌های تصادفی پر می‌کند و بیتی را که مقدار را به‌عنوان نشانی غیرواقعی شبکه مشخص می‌کند، تنظیم می‌کند.

آیا یکتایی UUIDها تضمین می‌شود؟ هیچ طرح شناسه‌ای نمی‌تواند یکتایی مطلق را تضمین کند، اما فضای ۱۲۸-بیتی تقریباً 3.4 × 10^38 مقدار ممکن دارد و UUID نسخهٔ ۴ حدود 5.3 × 10^36 مقدار تصادفی ممکن دارد. احتمال تکراری‌شدن برای تقریباً هر کاربرد عملی آن‌قدر کم است که می‌توان از آن صرف‌نظر کرد.

آیا می‌توانم از UUID به‌عنوان کلید اصلی پایگاه داده استفاده کنم؟ بله. UUIDها در سیستم‌های توزیع‌شده کلید اصلی مناسبی هستند، زیرا هر گره می‌تواند بدون هماهنگی با کارساز مرکزی یکی تولید کند. هزینهٔ آن ۱۶ بایت فضای ذخیره‌سازی برای هر کلید است که از یک عدد صحیح معمولی بیشتر است و ممکن است عملکرد نمایه‌سازی در جدول‌های بسیار بزرگ کندتر شود.

آیا UUID همان GUID است؟ بله. GUID (شناسهٔ یکتای سراسری) نام مایکروسافت برای همان مفهومی است که RFC ۴۱۲۲ با عنوان UUID تعریف کرده است.

آیا UUIDهای نسخهٔ ۴ را می‌توان بر اساس زمان ایجاد مرتب کرد؟ خیر. UUIDهای نسخهٔ ۴ تصادفی هستند و سابقه‌ای از زمان ایجاد خود ندارند. UUID نسخهٔ ۱ چنین سابقه‌ای دارد، اما ابتدا باید رمزگشایی شود؛ مرتب‌سازی متن، ترتیب ایجاد را نشان نمی‌دهد. نسخهٔ ۶، نسخهٔ ۷ و ULIDها برای مرتب‌شدن مستقیم به‌صورت متن طراحی شده‌اند.

منابع

  1. Davis, K., Peabody, B., & Leach, P. (۲۰۲۴). Universally Unique IDentifiers (UUIDs). RFC ۹۵۶۲. https://www.rfc-editor.org/rfc/rfc9562
  2. Leach, P., Mealling, M., & Salz, R. (۲۰۰۵). A Universally Unique IDentifier (UUID) URN Namespace. RFC ۴۱۲۲. https://www.rfc-editor.org/rfc/rfc4122
  3. شناسهٔ یکتای سراسری. در Wikipedia. https://en.wikipedia.org/wiki/Universally_unique_identifier
  4. شناسهٔ Snowflake. در Wikipedia. https://en.wikipedia.org/wiki/Snowflake_ID
  5. مشخصات ULID. GitHub. https://github.com/ulid/spec