تولیدکننده UUID v7

تولید آنلاین مقادیر UUID v7: شناسه‌های UUID قابل مرتب‌سازی بر اساس زمان با برچسب زمان ۴۸ بیتی میلی‌ثانیه و ۷۴ بیت تصادفی.

فرمت
شناسه‌های تولیدشده
آماده. مقادیر UUID v7 را در مرورگر خود تولید کنید.

ساختار این شناسه

طرح‌بندی
برچسب زمان ۴۸ بیتی یونیکس به میلی‌ثانیه، بیت‌های نسخه ۷، بیت‌های نوع RFC و پرکننده تصادفی.
آنتروپی
۷۴ بیت تصادفی در این پیاده‌سازی؛ فاقد شمارشگر یکنواخت (monotonic).
زمان
بله. ۴۸ بیت اول زمان ساخت را رمزگذاری می‌کنند، بنابراین شناسه‌ها در میلی‌ثانیه‌های مختلف بر اساس زمان مرتب می‌شوند.
خطر تداخل (Collision)
در یک میلی‌ثانیه، تداخل‌ها به ۷۴ بیت تصادفی بستگی دارند؛ برای حجم‌های فوق‌العاده بالا در یک میلی‌ثانیه، بهتر است از یک سرویس هماهنگ‌کننده شناسه استفاده شود.
نمونه
01a044bc-5969-7ebb-89ac-d9466d526994

شناسه‌های شما به صورت محلی با توابع تصادفی امن مرورگر تولید می‌شوند. هیچ چیز به BroBroGo ارسال نمی‌شود.

سوالات متداول

چرا به جای UUID v4 از UUID v7 استفاده کنیم؟

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

آیا UUID v7 زمان ساخت را پنهان می‌کند؟

خیر. برچسب زمان بخشی از شناسه است. اگر به یک شناسه مبهم بدون داده‌های زمانی نیاز دارید، از UUID v4 یا NanoID استفاده کنید.

ابزار تولید UUID نسخه ۷: شناسه‌های زمانی قابل مرتب‌سازی

این صفحه یک ابزار مرورگری برای تولید شناسه‌های UUID نسخه ۷ (UUID v7) ارائه می‌دهد. شما تعداد (بین ۱ تا ۱۰۰) و چند تنظیم نمایشی را مشخص می‌کنید و صفحه بلافاصله فهرستی از شناسه‌های UUID v7 را برمی‌گرداند – رشته‌های ۳۶ کاراکتری که بر اساس زمان ایجاد مرتب می‌شوند و قابل حدس‌زدن نیستند. هر شناسه را می‌توان به‌صورت جداگانه یا یکجا در کلیپ‌بورد کپی کرد.

UUID نسخه ۷ چیست و چه تفاوتی با دیگر قالب‌ها دارد؟

UUID v7 در ابتدای خود یک مُهر زمانی ۴۸‌بیتی از میلی‌ثانیه‌های یونیکس (Unix millisecond timestamp) را جاسازی می‌کند و پس از آن بیت‌های تصادفی قرار می‌گیرد. نتیجه یک شناسه ۱۲۸‌بیتی است که در نمایش متنی ۳۶ کاراکتر (شامل خط تیره) ظاهر می‌شود. برخلاف UUID v4 که کاملاً تصادفی است، UUID v7 بر اساس زمان ایجاد مرتب‌پذیر است. این ویژگی مشکل «محلیت ایندکس» (index locality) در پایگاه‌های داده را حل می‌کند: وقتی رکوردها با کلیدهای v7 درج می‌شوند، داده‌های جدید نزدیک به انتهای B-tree قرار می‌گیرند و از تکه‌تکه شدن ایندکس جلوگیری می‌شود.

با این حال، UUID v7 تضمین نمی‌کند که شناسه‌های تولیدشده در یک میلی‌ثانیه واحد به ترتیب دقیق قرار گیرند. بخش تصادفی ۸۰‌بیتی پس از مُهر زمانی باعث می‌شود که در یک میلی‌ثانیه، چندین شناسه ترتیب ثابت نداشته باشند. این نقطه‌ضعف در ابزار ما به وضوح ذکر شده: «UUID v7 و ULID بر اساس زمان ایجاد قابل مرتب‌سازی هستند، اما ترتیب دقیق برای شناسه‌های تولیدشده در یک میلی‌ثانیه تضمین نمی‌شود.» برای کاربردهایی که به ترتیب دقیق زیر میلی‌ثانیه نیاز دارند، باید از راه‌حل‌های دیگری مانند شمارنده‌های ترتیبی استفاده کرد.

مقایسه سریع:

ویژگی UUID v4 UUID v7 ULID
طول رشته ۳۶ کاراکتر ۳۶ کاراکتر ۲۶ کاراکتر
مبنای مرتب‌سازی تصادفی مُهر زمانی (۴۸ بیت) مُهر زمانی (۴۸ بیت)
تضمین ترتیب درون یک میلی‌ثانیه ندارد ندارد ندارد (اما با احتیاط می‌توان به آن نزدیک شد)
قابل حدس‌زدن بسیار سخت بسیار سخت (۸۰ بیت تصادفی) دشوار
استاندارد RFC RFC 4122 RFC 9562 غیر رسمی

چرا مرتب‌سازی زمانی در پایگاه داده اهمیت دارد؟

در پایگاه‌های داده رابطه‌ای مدرن، ایندکس‌ها معمولاً به شکل B-tree پیاده‌سازی می‌شوند. وقتی کلید اصلی یک جدول به صورت تصادفی تولید شود (مانند UUID v4)، رکورد جدید ممکن است در هر نقطه‌ای از درخت درج شود و باعث شکستگی برگ‌ها، تقسیم صفحات و افزایش تراکم I/O گردد. این پدیده «شکستگی ایندکس» (index fragmentation) نام دارد و می‌تواند سرعت نوشتن را تا چند برابر کاهش دهد.

UUID v7 با قرار دادن مُهر زمانی در ابتدای شناسه، رفتار مشابه کلید‌های خودافزایشی (auto-increment) را شبیه‌سازی می‌کند: رکوردهای جدید به انتهای ایندکس اضافه می‌شوند و صفحات جدید به ندرت شکسته می‌شوند. نتیجه نهایی بهبود چشمگیر در عملکرد درج، به‌ویژه در سناریوهای بار بالا (high throughput) مانند سیستم‌های رویدادمحور (event sourcing)، لاگ‌های حسابرسی و صف‌های پیام.

ابزار ما مستقیماً این موضوع را پوشش می‌دهد: «توسعه‌دهندگان سیستم‌های توزیع‌شده که به کلید اصلی قابل مرتب‌سازی نیاز دارند» و «مدیران پایگاه داده که می‌خواهند از شکستگی ایندکس ناشی از UUID v4 جلوگیری کنند» از جمله مخاطبان هدف هستند.

ورودی‌ها و خروجی‌های ابزار

ابزار یک فرم ساده دارد:

  • قالب (Format): UUID v7 (از یک انتخابگر قالب واحد انتخاب می‌شود. در حال حضر این صفحه فقط UUID v7 را پشتیبانی می‌کند.
  • تعداد (Count): یک عدد بین ۱ تا ۱۰۰ (شامل هر دو).
  • حروف بزرگ (Uppercase): یک سوئیچ که نمایش UUID را به حروف بزرگ تبدیل می‌کند.
  • شامل خط تیره (Include hyphens): یک سوئیچ برای حذف خط تیره‌های استاندارد از رشته خروجی.

خروجی‌ها:

  • فهرستی از شناسه‌های UUID v7 تولیدشده.
  • شمارش تعداد شناسه‌ها.
  • وضعیت «آماده» (Ready.) در حالت بیکار.
  • وضعیت «تولید شد» (Generated.) پس از هر بار تولید.
  • «همه کپی شد» (Copied all!) وقتی همه شناسه‌ها یکجا در کلیپ‌بورد کپی می‌شوند.
  • کلیک روی هر شناسه به صورت مجزا باعث کپی شدن آن شناسه در کلیپ‌بورد می‌شود.

قوانین اصلی:

  • تغییر هر یک از گزینه‌ها (تعداد، فرمت حروف، خط تیره) بلافاصله همه شناسه‌ها را دوباره تولید می‌کند.
  • شناسه‌ها به صورت کاملاً محلی در مرورگر با استفاده از تابع تصادفی قوی (crypto.getRandomValues) تولید می‌شوند. هیچ داده‌ای به سرور BroBroGo ارسال نمی‌شود.
  • حداکثر ۱۰۰ شناسه در هر بار تولید مجاز است.

موارد خاص و نکات فنی

  • تولید هم‌زمان در بسیاری از موارد: اگر چندین شناسه در یک میلی‌ثانیه تولید شود، اولویت بیت‌های تصادفی تعیین‌کننده است. بنابراین فهرست خروجی لزوماً به ترتیب زمان ایجاد دقیق نیست. این امر به دلیل ماهیت تصادفی بخش غیرزمانی است.
  • اثر حذف خط تیره: رشته UUID بدون خط تیره ۳۲ کاراکتر می‌شود. این فرمت گاهی برای ذخیره‌سازی در پایگاه‌های داده فشرده‌تر استفاده می‌شود، اما شناسه را از قالب استاندارد خارج می‌کند.
  • حروف بزرگ در مقابل کوچک: UUID v7 معمولاً با حروف کوچک نمایش داده می‌شود، اما برخی سیستم‌ها حروف بزرگ را می‌پذیرند. تغییر حالت حروف بر مقدار عددی تأثیر نمی‌گذارد.
  • قابلیت مرتب‌سازی با ULID: UUID v7 و ULID هر دو یک مُهر زمانی ۴۸‌بیتی دارند و از نظر مرتب‌سازی در سطح میلی‌ثانیه مشابه هستند. با این حال، ULID از الفبای Crockford’s Base32 استفاده می‌کند که ۲۶ کاراکتر است، در حالی که UUID v7 هگزادسیمال با خط تیره ۳۶ کاراکتر دارد.
  • عدم تضمین ترتیب در میلی‌ثانیه: این محدودیت ذاتی طراحی است. هیچ ابزاری نمی‌تواند برای شناسه‌های تصادفی در یک میلی‌ثانیه ترتیب قطعی ارائه دهد مگر اینکه یک شمارنده سریال یا زمان دقیق‌تر (مثلاً نانوثانیه) به کار رود.

مزایای تولید شناسه در مرورگر

تمام عملیات تولید در داخل مرورگر کاربر انجام می‌شود. این یعنی:

  • حریم خصوصی: داده‌ها به هیچ سرور خارجی فرستاده نمی‌شوند. حتی اگر ابزار در وب‌سایت شخص ثالثی استفاده شود، شناسه‌ها درون صفحه باقی می‌مانند.
  • سرعت و پاسخگویی: تولید صدها UUID در میلی‌ثانیه انجام می‌شود و وابستگی به شبکه وجود ندارد.
  • عدم نیاز به اتصال اینترنت: ابزار پس از بارگذاری اولیه، به صورت آفلاین کار می‌کند.
  • شفافیت: کاربر می‌تواند کد جاوااسکریپت صفحه را بررسی کند و مطمئن شود که از crypto.subtle یا Math.random امن استفاده شده است.

سوالات متداول (FAQ)

۱. آیا UUID v7 قابل پیش‌بینی است؟ خیر. بخش تصادفی UUID v7 شامل ۸۰ بیت تصادفی قوی از مرورگر است. برای پیش‌بینی یک شناسه v7، مهاجم باید هم مُهر زمانی (که می‌تواند حدودی معلوم باشد) و هم ۸۰ بیت تصادفی را حدس بزند. از نظر محاسباتی این غیرممکن است.

۲. تفاوت UUID v7 و ULID چیست؟ هر دو یک مُهر زمانی ۴۸‌بیتی دارند، اما ULID از الفبای Base32 استفاده می‌کند (۲۶ کاراکتر) و خط تیره ندارد، در حالی که UUID v7 هگزادسیمال با خط تیره اختیاری است (۳۶ یا ۳۲ کاراکتر). همچنین ULID در استاندارد RFC تعریف نشده است، در حالی که UUID v7 در RFC 9562 مشخص شده. هر دو ترتیب دقیق درون یک میلی‌ثانیه را تضمین نمی‌کنند.

۳. آیا می‌توان بیش از ۱۰۰ شناسه در یک بار تولید کرد؟ خیر. محدودیت ابزار ۱۰۰ عدد است. اگر به تعداد بیشتری نیاز دارید، می‌توانید چندین بار با تعداد ۱۰۰ تولید کنید. دلیل این محدودیت جلوگیری از بارگذاری بیش از حد صفحه و حفظ پاسخگویی است.

۴. چرا UUID v7 برای پایگاه داده بهتر از v4 است؟ UUID v4 به دلیل تصادفی بودن باعث شکستگی ایندکس B-tree می‌شود، در حالی که v7 بر اساس زمان مرتب است و رکوردهای جدید به انتهای ایندکس اضافه می‌شوند. این موضوع نرخ درج را افزایش می‌دهد و از تخریب عملکرد در طولانی مدت جلوگیری می‌کند.

۵. آیا حذف خط تیره یا تغییر حروف بر یکتایی شناسه تأثیر می‌گذارد؟ خیر. حذف خط تیره فقط نمایش را تغییر می‌دهد، مقدار عددی (۱۲۸ بیت) یکسان می‌ماند. حروف بزرگ و کوچک نیز معادل هستند. با این حال، اگر بخواهید شناسه را با فرمت استاندارد ذخیره کنید، خط تیره‌ها بخشی از پروتکل هستند.

۶. آیا تولید در مرورگر از نظر امنیتی خطرناک است؟ نه، برعکس. crypto.getRandomValues که ابزار از آن استفاده می‌کند، توسط تمام مرورگرهای مدرن پشتیبانی می‌شود و یک تولیدکننده اعداد تصادفی رمزنگاری‌شده (CSPRNG) است. این روش از Math.random قدیمی بسیار امن‌تر است. همچنین چون تولید محلی انجام می‌شود، کسی نمی‌تواند شناسه‌های شما را استراق سمع کند.