مولّد UUID v4
يولد UUID v4 عشوائية بأمان تشفيري
…
تنسيق
UUID v4 هو أكثر إصدارات UUID انتشاراً في البرمجيات الحديثة. على خلاف نظيراته التي تشتق بتاتها من طابع زمني أو تجزئة فضاء الأسماء، يُبنى UUID v4 بالكامل من بيانات عشوائية — مما يجعله الخيار الأبسط والأكثر قابلية للنقل حين تحتاج إلى معرّف فريد لا يحمل أي بيانات وصفية عن أصله.
يستخدم هذا المولّد crypto.randomUUID()، وهو واجهة برمجية أصيلة في المتصفحات وNode.js، تستمد الإنتروبيا من مولّد الأرقام العشوائية الآمن تشفيرياً في نظام التشغيل — المصدر ذاته المستخدم في مادة مفاتيح TLS.
ما هو UUID v4؟
المعرّف الفريد العالمي (UUID) هو تسمية بحجم 128 بت موحَّدة في RFC 4122. يُمثَّل عادةً كـ 32 رقماً سداسي عشري مجمَّعة بواصلات وفق النمط 8-4-4-4-12:
في UUID v4، 122 من أصل 128 بتاً عشوائية. الـ 6 بتات المتبقية حقول ثابتة تفرضها المواصفة: 4 بتات ترمّز الإصدار (0100 = 4) و2 بتات ترمّز متغيّر RFC 4122 (10). هذه البتات الثابتة هي السبب في أن المجموعة الثالثة تبدأ دائماً بـ 4 والمجموعة الرابعة تبدأ دائماً بـ 8 أو 9 أو a أو b.
تشريح UUID v4
تفكيك 550e8400-e29b-41d4-a716-446655440000:
| المقطع | البتات | المعنى |
|---|---|---|
| 550e8400 | 32 عشوائية | time_low (الاسم تاريخي — عشوائي كلياً في v4) |
| e29b | 16 عشوائية | time_mid (اسم تاريخي — عشوائي كلياً في v4) |
| 41d4 | 4 ثابتة + 12 عشوائية | نيبل الإصدار 4 (ثنائي 0100) + 12 بت عشوائي |
| a716 | 2 ثابتة + 14 عشوائية | بتات المتغيّر 10 (البتات العليا للبايت الأول) + 14 بت عشوائي |
| 446655440000 | 48 عشوائية | العقدة (عشوائية كلياً في v4) |
8 أو 9 أو a أو b — لأن أعلى بتتين من ذلك البايت مثبّتتان على 10 (علامة متغيّر RFC 4122)، تاركةً البتتين المتبقيتين حرّتين.UUID v4 مقابل الإصدارات الأخرى
يعرّف RFC 4122 خمسة إصدارات UUID. كل منها يحل مشكلة مختلفة:
يجمع طابعاً زمنياً 60 بت (بفترات 100 نانوثانية منذ أكتوبر 1582) مع عنوان MAC للمضيف. يتزايد بشكل رتيب داخل الجهاز الواحد.
Use when: تحتاج إلى معرّفات مرتّبة زمنياً ولا تمانع الكشف عن هوية الخادم ووقت التوليد.
حتمي: نفس الفضاء المسمّى + الاسم ينتجان دائماً UUID مطابقاً. يستخدم تجزئة MD5.
Use when: تحتاج إلى معرّفات قابلة للاستنساخ من فضاء أسماء معروف (مثل أسماء DNS). يُفضَّل v5 على v3.
122 بت من العشوائية الآمنة تشفيرياً. لا طابع زمني، لا MAC، لا فضاء أسماء. الخيار الأكثر شيوعاً للأغراض العامة.
Use when: تحتاج إلى معرّفات فريدة بلا معنى بنيوي وأقصى خصوصية.
مثل v3 لكن يستخدم SHA-1. لا يزال حتمياً من الفضاء المسمّى + الاسم.
Use when: تحتاج إلى معرّفات قابلة للاستنساخ تعتمد المحتوى (مثل معرّفات ثابتة للموارد المحدَّدة بعنوان URL).
أحدث (RFC 9562، 2024). يرمّز طابعاً زمنياً بمللي ثانية Unix في البتات العليا، ثم بتات عشوائية. قابل للترتيب وملائم لقواعد البيانات.
Use when: تحتاج إلى معرّفات ملائمة لفهارس قواعد البيانات مع ترتيب زمني طبيعي (يُفضَّل على v1 للمشاريع الجديدة).
متى تستخدم UUID v4
UUID v4 هو الخيار المناسب في الغالبية العظمى من الحالات التي تحتاج فيها ببساطة إلى «معرّف فريد» دون قيود إضافية:
معرّفات المستخدمين والحسابات
معرّفات مستخدمين غير شفّافة لا تكشف شيئاً عن وقت إنشاء الحساب أو هوية الخادم. لا يمكن تعدادها أو تخمينها.
المفاتيح الأساسية لقواعد البيانات
يعمل مع أي محرّك قاعدة بيانات. UUID v4 آمن للتوليد من جانب العميل والدمج من مصادر موزّعة دون تنسيق — لا حاجة لجدول تسلسل أو خدمة معرّفات مركزية.
معرّفات الجلسات والرموز
تجعل 122 بت من العشوائية تخمين القوة الغاشمة غير مجدٍ حسابياً — قابلة للمقارنة بقوة رمز عشوائي 122 بت.
أسماء الملفات والكائنات
أسماء ملفات آمنة من التكرار للتحميلات ومفاتيح S3 أو إدخالات الذاكرة المؤقتة. لا خطر من كتابة عميلين على نفس المفتاح.
مفاتيح الانعدامية
أنشئ UUID على العميل قبل إرسال الطلب. يمكن للخادم إزالة تكرار الطلبات المُعادة بأمان دون عدّاد مشترك.
معرّفات الارتباط والتتبع
أرفق UUID بكل سطر سجل وامتداد تتبع موزّع. لا حاجة للتنسيق عبر الخدمات أو الأجهزة.
احتمالية التصادم
مع 122 بت عشوائية، يحتوي فضاء UUID v4 على 2122 ≈ 5.3 × 1036 قيمة ممكنة. تتبع احتمالية التصادم مسألة عيد الميلاد:
المعيار المستشهَد به: لأن تكون فرصة تصادم واحدة 50%، ستحتاج إلى توليد ما يقارب 2.71 × 1018 UUID. بمعدّل مليار UUID في الثانية، سيستغرق ذلك نحو 85 عاماً من التوليد المستمر. في أي تطبيق واقعي، التصادمات ليست مصدر قلق عملي.
أمثلة الكود
JavaScript — المتصفح وNode.js 14.17+
طريقة crypto.randomUUID() متاحة أصيلياً في جميع المتصفحات الحديثة (Chrome 92+ وFirefox 95+ وSafari 15.4+) وفي Node.js 14.17+. لا حاجة لتثبيت حزمة.
// Browser or Node.js 14.17+
const id = crypto.randomUUID()
// → "110e8400-e29b-41d4-a716-446655440000"
// Generate multiple
const ids = Array.from({ length: 5 }, () => crypto.randomUUID())Node.js — الإصدارات الأقدم (حزمة uuid)
const { v4: uuidv4 } = require('uuid')
const id = uuidv4()
// → "110e8400-e29b-41d4-a716-446655440000"Python
import uuid # Generate a UUID v4 id = str(uuid.uuid4()) # → '110e8400-e29b-41d4-a716-446655440000' # The uuid module uses os.urandom() — cryptographically secure print(uuid.uuid4().hex) # without hyphens # → '110e8400e29b41d4a716446655440000'
Go
import "github.com/google/uuid" id := uuid.New().String() // → "110e8400-e29b-41d4-a716-446655440000" // Or using the standard library (Go 1.20+ with math/rand/v2 is NOT cryptographic) // Always prefer github.com/google/uuid for production use
Rust
# Cargo.toml
[dependencies]
uuid = { version = "1", features = ["v4"] }use uuid::Uuid; let id = Uuid::new_v4().to_string(); // → "110e8400-e29b-41d4-a716-446655440000"
الأسئلة الشائعة
هل UUID v4 آمن تشفيرياً؟
UUID v4 بحد ذاته ليس أداة أمنية — إنه تنسيق معرّف. غير أنه حين يُولَّد عبر crypto.randomUUID() (المتصفح أو Node.js) أو واجهات برمجية مكافئة على مستوى نظام التشغيل، تكون الإنتروبيا الأساسية آمنة تشفيرياً. هذا يعني أن قيم UUID v4 مناسبة للاستخدام كرموز جلسة أو مفاتيح انعدامية، حيث تهمّ عدم القدرة على التنبؤ. لا تستخدم مولّدات UUID المبنية على Math.random() للسياقات الحساسة أمنياً — استخدم فقط واجهات برمجية تسحب صراحةً من CSPRNG لنظام التشغيل.
هل يمكن أن يتساوى UUID v4 آخران؟
نعم نظرياً، لكن عملياً لا. احتمالية توليد نسخة مكرّرة ضمن أي مجموعة بيانات واقعية (مليارات المعرّفات) ضئيلة جداً — أقل احتمالاً بكثير من عطل أجهزة يسبّب فساد البيانات. يُعامَل تصادم UUID v4 كأمر مستحيل في تصميم الأنظمة الإنتاجية. إذا كنت تحتاج فعلاً إلى ضمان عدم التصادم، استخدم عدّاداً مركزياً أو تسلسل قاعدة بيانات.
UUID v4 مقابل nanoid — أيهما أختار؟
كلاهما مولّدات معرّفات عشوائية مدعومة بـ CSPRNG. الفروق الرئيسية:
- UUID v4 يتّبع معيار RFC 4122، ومعترَف به من كل قاعدة بيانات وإطار عمل، ولا يحتاج لأي تبعيات (أصيل عبر
crypto.randomUUID()). - nanoid يستخدم أبجدية آمنة لعناوين URL وهو أقصر افتراضياً (21 حرفاً مقابل 36). مفيد حين يهمّ طول URL أو القابلية للقراءة. يتطلب حزمة npm.
يُفضَّل UUID v4 حين تهمّ قابلية التشغيل البيني مع أنظمة خارجية (واجهات برمجية وقواعد بيانات وبنية تحتية للتسجيل). يُفضَّل nanoid حين تريد معرّفات أقصر وتتحكم في المكدّس الكامل.
هل يجب تخزين UUID كنصوص أم ثنائياً في قواعد البيانات؟
لمعظم قواعد البيانات، التخزين في عمود UUID أو BINARY(16) (16 بايت) أكفأ من سلسلة VARCHAR(36) (36 بايت). PostgreSQL لها نوع uuid أصيل. MySQL وMariaDB يعملان جيداً مع BINARY(16) وأدوات مساعدة UUID_TO_BIN() / BIN_TO_UUID(). مستخدمو SQLite يخزّنون عادةً كنص. لا تؤثر طريقة التخزين على التفرّد أو الصحة.
لماذا يحتوي UUID v4 على واصلات — وهل يمكن حذفها؟
الواصلات جزء من تمثيل UUID القانوني المعرَّف في RFC 4122. إنها مجرد زينة — لا تحمل أي معلومات ولا تؤثر على القيمة البالغة 128 بت. حذفها يعطيك سلسلة سداسية عشرية مضغوطة مكوّنة من 32 حرفاً مكافئة وظيفياً. تقبل معظم محللات UUID كلا الشكلين. عند الشك، استخدم الشكل القانوني بالواصلات لأقصى توافق مع الأدوات وقواعد البيانات الخارجية.
const id = crypto.randomUUID() // "550e8400-e29b-41d4-a716-446655440000"
const compact = id.replaceAll('-', '') // "550e8400e29b41d4a716446655440000"