مولد UUID

أنشئ معرّفات UUID في متصفحك: v4 عشوائي بالكامل، v7 مرتب زمنياً لمفاتيح قواعد البيانات، أو v5 حتمي من مساحة اسم واسم. أنشئ حتى 1000 دفعة واحدة، ولا تترك أي بيانات جهازك.

اضغط على «توليد» للاختيار
الإصدار
خيارات متقدمة

هل تحتاج إلى معرّف لن يتعارض مع معرّف أنشأه شخص آخر، على جهاز لم تسمع به من قبل، دون طلب الإذن من أي شخص؟ هذه هي الوظيفة التي يؤديها UUID. إنه رقم مكون من 128 بت، يُكتب على شكل 36 حرفاً بالنمط المألوف 8-4-4-4-12، وتصميمه بالكامل يضمن ألا يكون هناك اثنان متطابقان على الإطلاق حتى وإن لم ينسق أحد من سيحصل على أي منها. يقوم هذا المولد المجاني بإنشائها في متصفحك: اختر إصداراً في الإصدار، وحدد العدد الذي تحتاجه في العدد، واضغط على توليد. تفتح الصفحة على معرّف v4 واحد، وهو الإصدار الذي تريده معظم المشاريع، لذلك فإن أول معرّف يبعد عنك نقرة واحدة.

يتم بناء كل معرّف بواسطة متصفحك من خلال Web Crypto API. يستخدم الإصدار 4 crypto.randomUUID() حيثما يوفره المتصفح و crypto.getRandomValues() بخلاف ذلك — وهو مصدر عشوائي قوي تشفيرياً بدلاً من دالة JavaScript شبه عشوائية مثل Math.random(). يضع الإصدار 7 طابعاً زمنياً بالمللي ثانية مكوناً من 48 بت في المقدمة، ثم عداداً مكوناً من 12 بت يزداد خلال نفس المللي ثانية، ثم 62 بتاً عشوائياً، وهو أسلوب الترتيب الموصوف في RFC 9562؛ هذا العداد هو السبب في أن دفعة من الألف تخرج مرتبة بدلاً من أن تكون مبعثرة. يجمع الإصدار 1 بين طابع زمني من عام 1582 ومعرّف عقدة عشوائي تم تعيين بت البث المتعدد فيه، لذلك لا يحمل أبداً عنوان بطاقة الشبكة الخاصة بك بالطريقة التي فعلتها التطبيقات الأصلية في التسعينيات. الإصداران 3 و 5 ليسا عشوائيين على الإطلاق: فهما يقومان بتجزئة مساحة اسم مع اسم، باستخدام MD5 و SHA-1 على التوالي، وهذا التجزئة يحدث أيضاً على جهازك. لا يتم إرسال أي شيء إلى خادم، ولا يتم تسجيل أي شيء، وبمجرد تحميل الصفحة تستمر في العمل حتى عند انقطاع الاتصال.

حقل الإصدار هو الذي يقرر كل شيء آخر. الإصدار 4 عبارة عن 122 بتاً عشوائياً وبدون أي بنية — وهو الخيار الافتراضي، والإجابة الصحيحة عندما يكون المعرّف مطلوباً ليكون فريداً فقط. يحتفظ الإصدار 7 بـ 62 بتاً عشوائياً ولكنه يبدأ بوقت إنشائه، لذلك تُفرز مجموعة منها بالترتيب الذي صُنعت به؛ وهذا ما يجعله الإصدار المناسب عندما يصبح المعرّف مفتاحاً لقاعدة بيانات (primary key). الإصدار 1 هو المخطط الأصلي المعتمد على الوقت، وقد تم الاحتفاظ به هنا للأنظمة التي لا تزال تطلبه. الإصداران 3 و 5 هما الزوج الغريب: فهما حتميان، مما يعني أن نفس المدخلات تنتج دائماً نفس المعرّف، ويأخذان حقلين إضافيين — مساحة الأسماء، وهو أحد المساحات القياسية DNS و URL و OID و X.500 أو الخيار مخصص لمساحة خاصة بك، وحقل الاسم، وهو السلسلة النصية التي يتم تحديدها. إذا أعطيت v5 مساحة الاسم URL والرابط https://example.com/a، فستحصل على نفس UUID اليوم وغداً وعلى جهاز شخص آخر. وبسبب ذلك، يختفي حقل العدد عند اختيار v3 أو v5: فألف نسخة من قيمة حتمية واحدة ستكون مجرد ألف نسخة من نفس القيمة الحتمية. بالنسبة لأي إصدار آخر، يتراوح العدد من 1 إلى 1000.

تعمل أربعة مفاتيح على تغيير شكل المخرجات دون تغيير الـ 128 بت الموجودة تحتها. خيار أحرف كبيرة يطبع الأرقام الست عشرية بحروف كبيرة، وخيار بدون شرطات يعطي الشكل المدمج المكون من 32 حرفاً والذي تفضله بعض الأعمدة وأسماء الملفات، وخيار الأقواس المعقوفة يغلف القيمة بين { } — وهو الشكل الذي تطلق عليه أنظمة Windows وعالم .NET اسم GUID. ضمن خيارات متقدمة، يضيف urn:uuid: البادئة التي تجعله URN رسمياً؛ ويقوم بإيقاف تشغيل الأقواس المعقوفة وبدون شرطات أثناء تفعيله، لأن المعيار يسمح بنموذج URN واحد تماماً وهو النموذج القياسي المزوّد بالشرطات. يحدد تنسيق النسخ كيف يتم دمج الدفعة عند نسخها: واحد لكل سطر، أو مفصولة بفواصل، أو كل قيمة بين علامتي اقتباس متبوعة بفاصلة، ليتم لصقها مباشرة في مصفوفة في الكود. أسفل النتيجة يوجد سطر يوضح مقدار العشوائية بالبت — 122 للإصدار v4، و 62 للإصدار v7 — وبالنسبة للإصدار v7، يوضح الطابع الزمني المشفر في المعرّف الأول للدفعة، ليكون الوقت داخل القيمة مرئياً بدلاً من كونه ضمنياً. يحترم كل من نسخ الكل وحفظ إلى ملف إعدادات تنسيق النسخ. يحتفظ السجل بآخر 10 دفعات قمت بها في متصفحك الخاص: انقر على إحداها لاسترجاعها، أو انسخ أو احذف إدخالاً واحداً، أو امسح المجموعة بأكملها. يفرغ مسح النتيجة ويترك إعداداتك كما هي، وبعد تجاوز 50 معرّفاً تصبح القائمة كتلة واحدة قابلة للتمرير بدلاً من خمسين سطراً.

إن الأمر الأكثر أهمية في هذه الصفحة هو الفرق بين v4 و v7 كمفتاح أساسي (primary key)، وهو ليس مجرد مسألة تفضيل. فهارس قواعد البيانات عبارة عن أشجار B-tree محفوظة بترتيب مفروز، والمكان الذي يهبط فيه المفتاح الجديد في هذا الترتيب يحدد مقدار العمل الذي تكلفه عملية الإدراج. نظراً لأن مفتاح v4 عشوائي، فإن الإدراجات المتتالية تهبط في زوايا غير مترابطة من الفهرس: الصفحات التي كانت ممتلئة تنقسم (page split)، والأجزاء من الشجرة التي تحتفظ بها قاعدة البيانات في الذاكرة نادراً ما تكون هي الأجزاء التي يحتاجها الإدراج التالي، وينمو الفهرس ببطء أكبر مما تستحقه البيانات التي يشير إليها. يبدأ مفتاح v7 بالمللي ثانية الحالية، لذلك تهبط الإدراجات المتتالية بجوار بعضها البعض على الحافة اليمنى للشجرة، وهو النمط الذي ينتجه عدد صحيح يتزايد تلقائياً والنمط الذي بنيت حوله هياكل الفهارس. هذه هي المقايضة بأكملها: يمنحك v7 سلوك إدراج المفتاح التسلسلي مع الاحتفاظ بالخاصية التي جعلتك تختار UUIDs في المقام الأول، وهي أن أي شخص يمكنه صك واحد دون سؤال خادم. التكلفة هي أن وقت الإنشاء أصبح الآن مقروءاً داخل المعرّف، وما إذا كان ذلك مهماً فهو سؤال حول بياناتك، وليس حول التنسيق.

لا شيء يتحقق أبداً من تفرد UUID؛ فحجمه هو الضمان. لا يوجد سجل، ولا رحلة ذهاب وإياب للخادم، ولا بحث — يُنتج المولد رقماً ويسلمه، والسبب في عدم تعارض اثنين منها هو ببساطة أن هناك 2^122 من القيم الممكنة للإصدار v4، أي حوالي 5.3 أنديسيليون. مفارقة تاريخ الميلاد (birthday problem) هي الطريقة الصادقة لتقدير ذلك: ستحتاج تقريباً إلى 2.7 كوينتيليون معرّف قبل أن تكون هناك فرصة متساوية لتطابق أي اثنين منها، وهو ما يعادل مليار UUID جديد كل ثانية لمدة 86 عاماً. يجدر بنا أن نكون دقيقين بشأن ما يعد به هذا وما لا يعد به. إنها ضمانة إحصائية، وليست حسابية، وهي تصمد فقط طالما أن العشوائية الأساسية حقيقية — فالمولد الذي أُعطي بذرة سيئة، أو الآلة الافتراضية المستنسخة مع تجمع الإنتروبيا الخاص بها، يكسر هذه الضمانة بطريقة لا يستطيع التنسيق اكتشافها. يضيق الإصدار 7 السؤال أكثر: داخل مللي ثانية واحدة، لا يمكن لمولد واحد أن يكرر نفسه على الإطلاق، لأن العداد يزداد بدلاً من رمي النرد، وعبر المولدات المستقلة تتولى 62 بتاً عشوائياً القيام بالعمل.

إن UUID هو معرّف، وليس كلمة مرور. الإصدار 4 غير متوقع، وهذا يغري الناس للتعامل معه كسر — رابط لإعادة تعيين كلمة المرور، رابط URL لا يمكن تخمينه، رمز جلسة، أو مفتاح API. عدم القدرة على التنبؤ أمر حقيقي، لكن السرية هي خاصية تتعلق بكيفية التعامل مع القيمة، ويتم التعامل مع المعرّفات بإهمال بحكم تصميمها: فهي موجودة في عناوين URL، والتي ينتهي بها المطاف في سجل المتصفح، وسجلات الخادم، ورؤوس المُحيل، والتحليلات، ويتم لصقها في رسائل الدردشة. الإصدارات الأخرى مرشحة بأسوأ من ذلك. يقوم كل من الإصدار 1 والإصدار 7 بتشفير لحظة الإنشاء، لذلك فإن أي شخص يحمل أحدهما يعرف تقريباً متى تم صنعه ويمكنه تضييق نطاق كل شيء صُنع بجانبه. الإصداران 3 و 5 حتميان عن قصد: إن UUID v5 لعنوان بريد إلكتروني ليس سراً مجزأً، بل هو قيمة يمكن لأي شخص لديه نفس العنوان حسابها في ثانية. استخدم UUID لتسمية شيء ما. استخدم مولد كلمات مرور، أو رمزاً مميزاً من مكتبة مخصصة للأسرار، عندما يجب أن تظل القيمة غير معروفة.

لماذا أستخدم أداة توليد UUID هذه؟

تظهر معرّفات UUID في أي مكان يجب تسمية شيء فيه قبل أن يؤكد أي شيء آخر أن هذا الاسم متاح. يصك كود التطبيق معرّفات للصفوف التي يوشك على إدراجها، بحيث يكون للكائن هوية قبل أن يصل إلى قاعدة البيانات ويمكن للعميل الإشارة إليه بينما لا تزال عملية الكتابة قيد التقدم. تعتمد الأنظمة الموزعة عليها بقوة أكبر: عدة خدمات تكتب في جدول واحد، عميل هاتف محمول غير متصل بالإنترنت ينشئ سجلات على طائرة، قائمة انتظار يجب أن تتعرف على الرسالة التي عالجتها بالفعل — لا شيء من هذه يمكنه انتظار دوره للحصول على عداد مشترك. يغطي الإصدار 5 حاجة مختلفة، وهي معرّف مستقر مستمد من شيء تمتلكه بالفعل: نفس المستند، أو نفس الـ URL، أو نفس الحساب يُترجم دائماً إلى نفس الـ UUID، بحيث يمكن تشغيل عملية استيراد مرتين دون تكرار أي شيء. في أماكن أخرى، هي ببساطة التنسيق الذي يطلبه النظام — معرّف ارتباط يمر عبر السجلات والتتبعات، اسم ملف لن يتعارض عندما تهبط تحميلات من ألف مستخدم في حاوية واحدة، مفتاح سجل Windows، أو أداة اختبار (test fixture) يجب أن تبدو كبيانات حقيقية.

هناك بعض الحدود الصادقة التي تستحق المعرفة. الدفعة الواحدة تعني إصداراً واحداً: القيمة الموجودة في الإصدار تنطبق على كل ما بداخلها، لذلك فإن تشغيل v4 وتشغيل v7 هما دفعتان. هذا مولد، وليس فاحصاً — إن لصق UUID لقراءة إصداره أو طابعه الزمني ليس شيئاً تفعله هذه الصفحة. خيار حفظ إلى ملف يكتب ملفاً نصياً عادياً بدلاً من CSV أو JSON. يكشف الإصدار 7 صراحة عن وقت إنشائه، وصولاً إلى المللي ثانية، وهو تبادل حقيقي وليس عيباً، ويسرب الإصدار 1 الوقت بنفس الطريقة؛ إذا كان ذلك يمثل مشكلة لبياناتك، فإن الإصدار 4 هو الإصدار الذي لا يخبر أحداً بأي شيء. لا يُعدّ قيمتان خاصتان من المعيار إصدارين وبالتالي ليسا ضمن خيارات الإصدار، ولكن يمكنك نسخهما من هنا: nil UUID وهو 00000000-0000-0000-0000-000000000000، و max UUID وهو ffffffff-ffff-ffff-ffff-ffffffffffff. كل شيء في هذه الصفحة يتبع RFC 9562، وهي المواصفة التي حلت محل RFC 4122 في عام 2024، لذلك يتم قبول المخرجات بواسطة أي مكتبة أو قاعدة بيانات أو API تتعامل مع معرّفات UUID على الإطلاق. ضمن تلك الحدود، فإن الضمانة قوية: يتم بناء كل معرّف وفقاً للمعيار، من عشوائية آمنة تشفيرياً، على جهازك الخاص، ولا يراه أي شخص آخر أبداً.

FAQ

كيف أقوم بتوليد UUID؟

اختر إصداراً في الإصدار، وحدد العدد الذي تحتاجه في العدد، واضغط على توليد. تفتح الصفحة على معرّف إصدار 4 واحد، وهو ما تريده معظم المشاريع، لذلك فإن UUID العادي يبعد عنك نقرة واحدة. تظهر كل قيمة مع زر النسخ الخاص بها، ونسخ الكل يأخذ الدفعة بأكملها دفعة واحدة.

ما هو الفرق بين UUID v4 و v7؟

الإصدار 4 عبارة عن 122 بتاً عشوائياً بدون أي بنية على الإطلاق، لذلك لا توجد علاقة بين اثنين منها. يصرف الإصدار 7 أول 48 بتاً على المللي ثانية التي تم إنشاؤه فيها، ويضيف عداداً و 62 بتاً عشوائياً، وبالتالي فهو قابل للفرز: تخرج الدفعة بالترتيب الذي تم صنعها به. استخدم v4 عندما يجب أن يكون المعرّف فريداً فقط، و v7 عندما سيكون أيضاً مفتاحاً لقاعدة البيانات.

ما هو إصدار UUID الذي يجب أن أستخدمه؟

الإصدار 4 ما لم يكن لديك سبب لاختيار إصدار آخر. اختر الإصدار 7 إذا أصبح المعرّف مفتاحاً أساسياً وكانت أداء الإدراج مهماً، والإصدار 5 إذا كنت بحاجة إلى أن تنتج نفس المدخلات نفس المعرّف دائماً، والإصدار 1 فقط إذا كان النظام الذي يتعين عليك التحدث إليه يطلب ذلك على وجه التحديد. الإصدار 3 هو الإصدار 5 مع استخدام MD5 بدلاً من SHA-1، وموجود لأغراض التوافق.

هل معرّفات UUID التي تم إنشاؤها عشوائية وآمنة حقاً؟

العشوائية آمنة تشفيرياً: فهي تأتي من Web Crypto API في متصفحك، من خلال crypto.randomUUID() أو crypto.getRandomValues()، وليس من Math.random(). الآمن بمعنى "لا يمكن تخمينه" هو سؤال مختلف عن الآمن بمعنى "سري" — إن UUID هو معرّف، ولا ينبغي استخدامه ككلمة مرور، أو رمز جلسة، أو مفتاح API.

هل يمكنني إنشاء الكثير من معرّفات UUID في وقت واحد؟

نعم، حتى 1000 دفعة واحدة. حدد العدد واضغط على توليد؛ بعد تجاوز خمسين قيمة تصبح النتيجة كتلة واحدة قابلة للتمرير بدلاً من قائمة طويلة من الصفوف. يأخذ كل من نسخ الكل وحفظ إلى ملف الدفعة بأكملها، مدمجة بالطريقة التي يحددها تنسيق النسخ — واحد في كل سطر، أو مفصولة بفواصل، أو مقتبسة للصقها في مصفوفة.

لماذا يعطيني v3 و v5 نفس UUID في كل مرة؟

لأن هذا هو ما صُمما من أجله. الإصداران 3 و 5 حتميان: فهما يقومان بتجزئة مساحة الاسم والاسم الذي تقدمه لهما، لذلك تنتج المدخلات المتطابقة دائماً معرّفاً متطابقاً، على أي جهاز وبأي لغة. هذا يجعلها مفيدة لاستنباط معرّف مستقر من شيء تمتلكه بالفعل، وهو أيضاً سبب إخفاء حقل العدد عند تحديدهما.

ما هي مساحة الأسماء والاسم، وأي مساحة اسم يجب أن أختار؟

إنهما المدخلان اللذان يتم حساب UUID الإصدار 3 أو الإصدار 5 منهما. يحدد مساحة الأسماء نوع الاسم — DNS لأسماء المضيفين، URL للعناوين، OID و X.500 لمخططات الدلائل تلك، أو مخصص إذا كنت ترغب في تقديم مساحة اسم UUID خاصة بك، وهو الخيار المعتاد داخل التطبيق. أما الاسم فهو السلسلة النصية نفسها. تعطي مساحات الأسماء المختلفة نتائج مختلفة تماماً لنفس الاسم، وهذا هو الهدف من وجودها.

لماذا يُعد UUID v7 أفضل من v4 للمفتاح الأساسي لقاعدة البيانات؟

بسبب المكان الذي تهبط فيه القيم داخل الفهرس. يُحفظ الفهرس بترتيب مفروز، ويهبط مفتاح v4 العشوائي في أي مكان فيه، لذلك تقسم الإدراجات الصفحات (page split) في جميع أنحاء الشجرة، والأجزاء المحفوظة في الذاكرة نادراً ما تكون هي الأجزاء المطلوبة تالياً. يبدأ مفتاح v7 بالمللي ثانية الحالية، لذلك تهبط الإدراجات المتتالية معاً في نهاية الفهرس، وهي الطريقة التي يتصرف بها المفتاح الصحيح المتسلسل — مع السماح لأي خدمة بصك معرّف دون سؤال عداد مركزي.

هل يمكن لاثنين من معرّفات UUID أن يكونا متطابقين على الإطلاق؟

من حيث المبدأ نعم، لكن عملياً لا، ويستحق الأمر معرفة السبب. لا يوجد ما يتحقق من التفرد: هناك ببساطة 2^122 قيمة ممكنة للإصدار 4، أي حوالي 5.3 أنديسيليون، وستحتاج تقريباً إلى 2.7 كوينتيليون منها — مليار كل ثانية لمدة 86 عاماً — قبل أن تكون هناك فرصة متساوية لحدوث تصادم واحد. الضمانة إحصائية وليست مطلقة، وهي تعتمد على كون العشوائية حقيقية، وهو السبب في أن هذا المولد يستخدم Web Crypto API بدلاً من دالة شبه عشوائية عادية.

هل يمكنني استخدام UUID ككلمة مرور أو مفتاح API أو رمز جلسة؟

لا، وهذا هو الخطأ الذي يكلف الكثير. الإصدار 4 غير متوقع، لكن يتم التعامل مع المعرّفات كما لو كانت عامة: حيث ينتهي بها المطاف في عناوين URL، وسجل المتصفح، وسجلات الخوادم، ورؤوس المُحيل، والتحليلات. كما تكشف الإصدارات 1 و 7 إضافياً عن وقت إنشائها، ويمكن لأي شخص يعلم المدخلات إعادة حساب الإصدارين 3 و 5. لأي شيء يجب أن يظل سرياً، استخدم مولد كلمات مرور أو رمزاً مميزاً من مكتبة مخصصة للأسرار.

هل يكشف UUID v7 عن وقت إنشائه؟

نعم، حتى مستوى المللي ثانية، وهذا بسبب التصميم وليس سهواً — فالطابع الزمني هو ما يجعل v7 قابلاً للفرز. يوضح السطر الموجود أسفل النتيجة الوقت المشفر في أول قيمة من الدفعة، حتى تتمكن من رؤية ما هو مكشوف بالضبط. يحمل الإصدار 1 طابعاً زمنياً أيضاً. إذا كان وقت الإنشاء شيئاً تفضل عدم نشره، فإن الإصدار 4 لا يحتوي على أي وقت على الإطلاق.

هل يعرض UUID v1 عنوان MAC الخاص بي؟

ليس هنا. استخدم المخطط الأصلي عنوان بطاقة شبكة الجهاز كحقل للعقدة، ومن هنا جاءت سمعة v1، لكن المعيار يسمح أيضاً بمعرّف عقدة عشوائي محدد ببت البث المتعدد، وهذا ما ينتجه هذا المولد. لا يتم أبداً قراءة عنوان جهازك ولا يظهر أبداً في المخرجات.

ما الذي تغيره أحرف كبيرة وبدون شرطات والأقواس المعقوفة و urn:uuid:؟

العرض فقط — الـ 128 بت تحتها متطابقة في كل شكل. يطبع خيار أحرف كبيرة الأرقام الست عشرية بحروف كبيرة، ويعطي خيار بدون شرطات النسخة المدمجة المكونة من 32 حرفاً، ويغلف خيار الأقواس المعقوفة القيمة بين { } بالطريقة التي يكتب بها Windows و .NET معرّف GUID، ويضيف urn:uuid: البادئة التي تجعله URN رسمياً. يقوم urn:uuid: بإيقاف تشغيل الخيارين الآخرين أثناء تفعيله، لأن المعيار يحدد نموذج URN واحداً تماماً وهو النموذج القياسي المزوّد بالشرطات.