كيف تستخدم مولّد UUID
- اختر الإصدار: v4 (عشوائي) أو v7 (مرتّب زمنيًا).
- حدّد عدد معرّفات UUID التي تحتاجها، من معرّف واحد إلى قائمة كبيرة.
- يمكنك اختياريًا التبديل إلى الأحرف الكبيرة أو إزالة الشرطات.
- انسخ قيمة واحدة أو القائمة كلها.
تُولَّد معرّفات UUID في متصفحك باستخدام مولّد الأرقام العشوائية الآمن تشفيريًا الخاص به. لا تُرسل أبدًا إلى خوادمنا ولا تُخزَّن عليها، فلا يعرف أحد غيرك المعرّفات التي أنشأتها.
ما هو UUID؟
UUID (المعرّف الفريد عالميًا، Universally Unique Identifier) قيمة بطول 128 بت يمكن توليدها بشكل مستقل على أي جهاز، مع احتمال ضئيل جدًا لتطابقها مع أي قيمة أخرى. لا حاجة إلى سجل مركزي أو إلى الرجوع إلى قاعدة البيانات، وهذا ما يجعل معرّفات UUID مثالية للأنظمة الموزعة والعملاء غير المتصلين بالإنترنت ودمج البيانات من مصادر متعددة. وهي أيضًا خيار شائع لمعرّفات الطلبات ولمطالبة jti داخل الرموز المميزة التي يمكنك فحصها باستخدام أداة فك ترميز JWT. أما GUID (المعرّف الفريد العام، Globally Unique Identifier) فهو اسم Microsoft للشيء نفسه.
تُكتب معرّفات UUID على شكل 32 رقمًا ست عشريًا في خمس مجموعات تفصل بينها شرطات، وفق النمط 8-4-4-4-12 (36 حرفًا إجمالًا):
f47ac10b-58cc-4372-a567-0e02b2c3d479
^ ^
| variant (8, 9, a or b)
version (4)
الرقم الأول في المجموعة الثالثة هو الإصدار (version)؛ والرقم الأول في المجموعة الرابعة يرمّز المتغيّر (variant). المواصفة الحالية هي RFC 9562 (2024)، التي حلّت محل RFC 4122 وأضافت الإصدارات 6 و7 و8.
الإصدار 4 مقابل الإصدار 7
| UUID v4 | UUID v7 | |
|---|---|---|
| المحتوى | 122 بت عشوائية (6 بتات ثابتة للإصدار والمتغيّر) | طابع زمني Unix بطول 48 بت بالمللي ثانية، تليه بتات عشوائية |
| ترتيب الفرز | عشوائي | زمني تقريبًا |
| ما يكشفه | لا شيء | وقت إنشائه |
| الأنسب لـ | الرموز المميزة، والمعرّفات العامة، والاستخدام العام | المفاتيح الأساسية في قواعد البيانات، وسجلات الأحداث |
لماذا يُعدّ v7 أفضل لفهارس قواعد البيانات
تُخزَّن المفاتيح الأساسية عادةً في فهرس B-tree. قيم v4 العشوائية تقع في مواضع عشوائية، فيلمس كل إدراج صفحة مختلفة، مما يسبب انقسام الصفحات وضعف الاستفادة من ذاكرة التخزين المؤقت وتضخّم الفهرس في الجداول الكبيرة. ولأن معرّفات UUID من الإصدار v7 تبدأ بطابع زمني، تُضاف القيم الجديدة قرب نهاية الفهرس، على غرار عدد صحيح يتزايد تلقائيًا (auto-increment)، مع الاحتفاظ بمزايا المعرّفات الفريدة عالميًا التي يولّدها العميل.
أخطاء شائعة
- تخزين معرّفات UUID كنص. السلسلة المكوّنة من 36 حرفًا تشغل أكثر من ضعف مساحة البايتات الخام الـ16. استخدم النوع الأصلي
uuid(PostgreSQL) أوBINARY(16)(MySQL). - استخدام معرّفات UUID كأسرار. قيم v4 يصعب تخمينها، لكنها معرّفات لا بيانات اعتماد. وقيم v7 تكشف وقت إنشائها ويمكن توقّع جزء منها. استخدم رمزًا عشوائيًا مخصصًا لإعادة تعيين كلمات المرور ومفاتيح API.
- المقارنات الحساسة لحالة الأحرف. تنص RFC 9562 على أن يكون الإخراج بأحرف صغيرة، لكنها تشترط قبول الإدخال بأي من الحالتين. وحّد حالة الأحرف قبل مقارنة السلاسل.
- مصادر عشوائية ضعيفة. توليد معرّفات UUID من الإصدار v4 باستخدام
Math.random()يُضعف تفرّدها. استخدم مولّدًا آمنًا تشفيريًا.
توليد معرّفات UUID في الشيفرة البرمجية
// JavaScript (browsers and Node.js)
crypto.randomUUID(); // v4
# Python
import uuid
uuid.uuid4()
uuid.uuid7() # Python 3.14+
-- PostgreSQL
SELECT gen_random_uuid(); -- v4 (PostgreSQL 13+)
SELECT uuidv7(); -- PostgreSQL 18+
// Java
java.util.UUID.randomUUID();
// C# / .NET
Guid.NewGuid(); // v4
Guid.CreateVersion7(); // .NET 9+
# Shell (Linux, macOS)
uuidgen
الأسئلة الشائعة
هل يمكن أن يتطابق معرّفا UUID؟
نظريًا نعم، وعمليًا لا. مع 122 بت عشوائية، يكون عدد قيم v4 الممكنة كبيرًا جدًا لدرجة أنك ستحتاج إلى توليد مليارات معرّفات UUID كل ثانية لعقود طويلة قبل أن يصبح ظهور تكرار واحد محتملًا. وحالات التطابق في الأنظمة الحقيقية تأتي دائمًا تقريبًا من مولّد أرقام عشوائية معطوب أو من بيانات منسوخة، لا من الصدفة.
ما الفرق بين UUID وGUID؟
لا فرق عمليًا. GUID هو المصطلح المستخدم في تقنيات Microsoft؛ والتنسيق والحجم متطابقان.
هل أستخدم v4 أم v7؟
استخدم v7 للمفاتيح الأساسية في قواعد البيانات ولأي شيء تريد فرزه حسب وقت الإنشاء. واستخدم v4 عندما يجب ألا يكشف المعرّف أي شيء، مثل المعرّفات الظاهرة في عناوين URL العامة.
هل UUID الصفري (nil) صالح؟
نعم. 00000000-0000-0000-0000-000000000000 هو UUID الصفري الخاص، وتعرّف RFC 9562 أيضًا UUID الأقصى (max) المكوّن بالكامل من الأرقام f. ويُستخدم كلاهما كثيرًا كقيمة نائبة (placeholder).
آخر تحديث