مولد UUID: أنشئ معرفات فريدة عالميًا مجانًا
ما هو UUID؟
UUID (معرف فريد عالميًا) هو معرف مكون من 128 بت يستخدم في أنظمة الكمبيوتر لتحديد المعلومات بشكل فريد. يتم توحيد UUID وفقًا لـ RFC 4122، وبفضل إنتروبياها الهائلة، تضمن احتمال اصطدام شبه معدوم - وهذا يعني أن اثنين من UUIDs التي تم إنشاؤها بشكل مستقل ستكون فريدة تقريبًا بالتأكيد.
يحتوي UUID على تنسيق قياسي: xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx، حيث كل x هو رقم سداسي عشري (0-9، a-f)، M يشير إلى إصدار UUID، و N يشير إلى المتغير.
إصدارات UUID
UUID v1 (طابع زمني + عنوان MAC)
يعتمد UUID v1 على الطابع الزمني الحالي وقيمة عشوائية (في المتصفح، بدلاً من عنوان MAC). يستخدم فواصل 100 نانو ثانية من 15 أكتوبر 1582 (التقويم الغريغوري).
الاستخدامات:
- الحالات التي تحتاج فيها إلى ترتيب زمني لـ UUID
- تصحيح الأخطاء وتسجيلها (يحتوي UUID على معلومات وقت الإنشاء)
- الأنظمة الموزعة مع المزامنة الزمنية
مثال: 6ba7b810-9dad-11d1-80b4-00c04fd430c8
المزايا:
- يمكن ترتيب UUID زمنيًا حسب وقت الإنشاء
- مفيد للتدقيق وتصحيح الأخطاء
- يحتوي على معلومات الطابع الزمني
العيوب:
- مخاطر أمنية محتملة – يحتوي على طابع زمني
- في المتصفح لا يحتوي على عنوان MAC حقيقي (تم استبداله بقيمة عشوائية)
- موقع قاعدة بيانات سيء (الطابع الزمني في البتات ذات الترتيب الأدنى)
UUID v3 (تجزئة MD5)
يتم إنشاء UUID v3 باستخدام تجزئة MD5 للمساحة الاسمية UUID والاسم. حتمي – نفس المساحة الاسمية + الاسم سينشئان دائمًا نفس UUID.
الاستخدامات:
- تحويل عناوين URL أو أسماء DNS أو معرفات أخرى إلى UUID
- الحالات التي تحتاج فيها إلى UUIDs قابلة للاستنساخ
- الربط بين أنظمة تحديد الهوية المختلفة
مثال: a3bb189e-8bf9-3888-9912-ace4e6543002
المزايا:
- حتمي (نفس الإدخال = نفس الإخراج)
- مثالي لتحويل المعرفات المعروفة
- لا يوجد اصطدام لإدخالات مختلفة
العيوب:
- MD5 هي خوارزمية قديمة (فضل v5)
- يتطلب مساحة اسمية واسم
- لا يمكن استرداد الإدخال الأصلي
UUID v4 (عشوائي) - موصى به
الإصدار الأكثر استخدامًا من UUID. يتم إنشاء UUID v4 بشكل عشوائي بحت باستخدام مولد أرقام عشوائية آمن من الناحية التشفيرية (crypto.getRandomValues()).
الاستخدامات:
- مفاتيح قاعدة البيانات الأساسية
- معرفات الجلسة (Session IDs)
- أسماء الملفات الفريدة
- رموز API
- أغراض عامة حيث تحتاج إلى معرفات فريدة مضمونة
مثال: f47ac10b-58cc-4372-a567-0e02b2c3d479
المزايا:
- أقصى إنتروبيا وأمان
- لا يوجد اعتماد على الوقت أو معلمات النظام
- أبسط تطبيق
احتمال الاصطدام: عند إنشاء مليار UUID في الثانية لمدة 100 عام، فإن فرصة الاصطدام تبلغ حوالي 0.00000006%.
UUID v5 (تجزئة SHA-1)
UUID v5 هو نفس v3، لكنه يستخدم SHA-1 بدلاً من MD5. بديل أحدث وأكثر أمانًا لـ v3.
الاستخدامات:
- نفس استخدامات v3، ولكن بأمان أفضل
- مفضل على v3 للمشاريع الجديدة
- إنشاء UUIDs من عناوين URL، أسماء DNS، OID، X.500 DN
مثال: 886313e1-3b8a-5372-9b90-0c9aee199e5d
المزايا:
- حتمي
- SHA-1 أقوى من MD5
- مناسب للربط بين الأنظمة
العيوب:
- يُعتبر SHA-1 قديمًا أيضًا (لكنه لا يزال أكثر أمانًا من MD5)
- يتطلب مساحة اسمية واسم
UUID v6 (طابع زمني مرتب)
UUID v6 هو نسخة محسنة من v1 مع إعادة ترتيب بتات الوقت لتحسين فهرسة قاعدة البيانات. مصمم لحل مشاكل الموقع في قواعد البيانات.
الاستخدامات:
- مفاتيح قاعدة البيانات الأساسية مع الترتيب الزمني
- الأنظمة التي تتطلب ترتيبًا زمنيًا وأداء قاعدة بيانات
- بديل أحدث لـ v1
مثال: 1ec9414c-232a-6b00-b3c8-9e6bdeced846
المزايا:
- موقع قاعدة بيانات أفضل من v1 (الطابع الزمني في البتات ذات الترتيب الأعلى)
- ترتيب زمني
- متوافق مع معيار UUID
العيوب:
- أقل استخدامًا من v1/v4
- لا يزال يحتوي على معلومات الوقت (مخاطر أمنية)
UUID v7 (طابع زمني Unix)
يستخدم UUID v7 طابعًا زمنيًا من Unix (بالمللي ثانية منذ عام 1970) + بتات عشوائية. أحدث إصدار من UUID مع أفضل موقع لقاعدة البيانات.
الاستخدامات:
- مفاتيح قاعدة البيانات الأساسية الحديثة
- الأنظمة التي تتطلب الأداء + الترتيب الزمني
- بديل لـ v1/v6 في المشاريع الجديدة
مثال: 017f22e2-79b0-7cc3-98c4-dc0c0c07398f
المزايا:
- أفضل موقع لقاعدة البيانات من بين جميع الإصدارات
- الطابع الزمني Unix قياسي
- يجمع بين مزايا العشوائية والترتيب الزمني
العيوب:
- مواصفات جديدة نسبيًا (RFC 4122bis)
- دعم أقل في الأنظمة القديمة
أي إصدار من UUID تستخدم؟
دليل اتخاذ القرار
هل تحتاج إلى أقصى قدر من الأمان والعشوائية؟ ← استخدم UUID v4 (الخيار الأكثر شيوعًا)
هل تحتاج إلى ترتيب زمني وأداء قاعدة بيانات؟ ← استخدم UUID v7 (حديث) أو UUID v6 (قياسي)
هل تحتاج إلى UUIDs قابلة للاستنساخ من معرفات موجودة؟ ← استخدم UUID v5 (SHA-1) أو UUID v3 (MD5، قديم)
هل تحتاج إلى طابع زمني وسجل تدقيق؟ ← استخدم UUID v1 (قديم، أداء قاعدة بيانات أسوأ)
قواعد البيانات
للمشاريع الجديدة: UUID v7 أو v4
- v7 مثالي للترتيب الزمني + الأداء
- v4 لأقصى قدر من العشوائية بدون معلومات زمنية
للأنظمة القديمة: UUID v1 أو v6
- v6 لديه موقع قاعدة بيانات أفضل من v1
- v1 مدعوم على نطاق واسع
مزايا UUID كمفتاح أساسي:
- تفرد عالمي – يمكنك ربط البيانات من قواعد بيانات مختلفة دون تعارض
- الأمان – على عكس المعرفات التسلسلية (1، 2، 3…)، لا يمكن تخمين القيم التالية
- الأنظمة الموزعة – يمكن إنشاء UUIDs بشكل مستقل على خوادم متعددة دون تنسيق
- دمج قواعد البيانات – لا تنشأ تعارضات عند دمج قاعدتي بيانات
العيوب:
- حجم أكبر (16 بايت مقابل 4-8 بايت للعدد الصحيح)
- فهرسة أبطأ في بعض قواعد البيانات (استخدم v6/v7 لتحسين الأداء)
- أقل قابلية للقراءة للبشر
واجهات برمجة التطبيقات وخدمات الويب
- REST API – معرفات فريدة للموارد
- GraphQL – معرفات عالمية للعقد
- Webhook – تتبع الطلبات والاستجابات
- الرموز المميزة – معرفات الجلسة، رموز التحديث
الملفات والتخزين
- أسماء الملفات – منع الاصطدامات عند التحميل
- S3/التخزين السحابي – مسارات فريدة للكائنات
- مفاتيح التخزين المؤقت – معرفات في أنظمة التخزين المؤقت
تطبيقات الواجهة الأمامية
- مكونات React/Vue – مفاتيح فريدة للقوائم
- معرفات مؤقتة – معرفات قبل الحفظ في قاعدة البيانات
- التخزين المحلي – مفاتيح للبيانات المخزنة
- تطبيقات “غير متصل أولاً” – إنشاء معرفات بدون اتصال بالخادم
ميزات المولد المتقدمة
إنشاء UUID بوقت مخصص
بالنسبة للإصدارات التي تعتمد على الوقت (v1, v6, v7)، يمكنك تحديد أي طابع زمني باستخدام منتقي التاريخ والوقت. هذا مفيد لـ:
الاختبار:
- محاكاة UUIDs التي تم إنشاؤها في الماضي
- اختبار الترتيب الزمني في قواعد البيانات
- استنساخ UUIDs لتصحيح الأخطاء
ترحيل البيانات:
- إنشاء UUIDs مع طوابع زمنية تاريخية
- إعادة ملء البيانات بقيم الطابع الزمني الصحيحة
- استيراد البيانات من فترات زمنية مختلفة
التدقيق والامتثال:
- إعادة بناء UUIDs حسب وقت إنشاء السجل
- إنشاء معرفات بأثر رجعي
مثال للاستخدام:
- اختر الإصدار v1 أو v6 أو v7
- اضبط التاريخ والوقت باستخدام منتقي التاريخ والوقت
- أنشئ UUID مع الطابع الزمني المخصص لك
UUID المستندة إلى التجزئة (v3, v5)
بالنسبة لـ UUIDs الحتمية، يمكنك استخدام الإصدارين v3 (MD5) أو v5 (SHA-1):
كيفية الاستخدام:
- اختر المساحة الاسمية وفقًا لنوع معرفك
- أدخل الاسم/القيمة
- أنشئ UUID
أمثلة:
| المساحة الاسمية | الاسم (الإدخال) | الاستخدام |
|---|---|---|
| DNS | example.com | تحويل اسم النطاق إلى UUID |
| DNS | google.com | كل موقع ويب له UUID فريد |
| URL | https://example.com/page | تحويل URL إلى UUID |
| URL | https://api.example.com/users/123 | نقطة نهاية API كـ UUID |
| OID | 1.3.6.1.4.1.343 | معرف الكائن إلى UUID |
| X.500 | CN=John Doe,O=Company | الاسم المميز إلى UUID |
خصائص مهمة:
- ✅ حتمية: نفس الإدخال = نفس UUID دائمًا
- ✅ قابلة للاستنساخ: يمكنك إعادة إنشاء UUID في أي وقت
- ✅ متسقة: نفس UUID عبر أنظمة مختلفة
- ❌ لا يمكن فك التشفير: لا يمكن استعادة الاسم الأصلي من UUID
- ℹ️ UUID واحد: لـ v3/v5، يتم دائمًا إنشاء UUID واحد فقط (نفس الإدخال = نفس الإخراج)
الاستخدام العملي:
// مثال: تحويل URL إلى UUID v5
Namespace: URL
Name: https://example.com/api/users/123
Result: 886313e1-3b8a-5372-9b90-0c9aee199e5d
// نفس الإدخال = نفس UUID دائمًا
Namespace: DNS
Name: google.com
Result: نفس UUID دائمًا لـ google.com
كيف تستخدم UUID بأمان؟
الأمان التشفيري
يستخدم مولدنا crypto.getRandomValues()، وهو مولد أرقام عشوائية آمن تشفيريًا. على عكس Math.random()، الذي يمكن التنبؤ به وغير مناسب لأغراض الأمان، يوفر crypto.getRandomValues() إنتروبيا حقيقية مناسبة لـ:
- إنشاء رموز أمان
- معرفات الجلسة
- مفاتيح API
- تطبيقات التشفير
مقارنة إصدارات UUID
| الإصدار | الأساس | الاصطدام | الترتيب الزمني | أداء قاعدة البيانات | الاستخدام |
|---|---|---|---|---|---|
| v1 | طابع زمني + MAC | منخفض | ✅ نعم | ❌ أسوأ | قديم، تدقيق |
| v3 | تجزئة MD5 | لا شيء (حتمي) | ❌ لا | ⚠️ متوسط | تحويلات (قديم) |
| v4 | عشوائي | منخفض للغاية | ❌ لا | ⚠️ متوسط | استخدام عام |
| v5 | تجزئة SHA-1 | لا شيء (حتمي) | ❌ لا | ⚠️ متوسط | تحويلات (موصى به) |
| v6 | طابع زمني مرتب | منخفض | ✅ نعم | ✅ أفضل | قاعدة بيانات حديثة مع وقت |
| v7 | طابع زمني Unix | منخفض | ✅ نعم | ✅ الأفضل | مشاريع جديدة |
UUID مقابل معرفات أخرى
| النوع | الحجم | الاصطدام | الترتيب الزمني | الاستخدام |
|---|---|---|---|---|
| معرف الزيادة التلقائية | 4-8 بايت | فريد مضمون داخل الجدول | ❌ | تطبيقات بسيطة، قاعدة بيانات محلية |
| UUID v4 | 16 بايت | مستحيل عمليًا | ❌ | أنظمة موزعة، API |
| UUID v7 | 16 بايت | مستحيل عمليًا | ✅ | قاعدة بيانات حديثة ذات أداء |
| ULID | 16 بايت | مستحيل عمليًا | ✅ | UUID + ترتيب أبجدي |
| Snowflake ID | 8 بايت | فريد مضمون عند التكوين الصحيح | ✅ | تويتر، أنظمة موزعة |
| NanoID | قابل للتكوين | يعتمد على الطول | ❌ | معرفات صديقة لـ URL |
التنفيذ بلغات مختلفة
JavaScript/TypeScript
// UUID v4 - أبسط طريقة (المتصفحات الحديثة)
const uuid = crypto.randomUUID();
// UUID v4 - تطبيق يدوي
function generateUUIDv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
const r = (crypto.getRandomValues(new Uint8Array(1))[0] & 0x0f) >> (c === 'x' ? 0 : 2);
const v = c === 'x' ? r : (r & 0x3) | 0x8;
return v.toString(16);
});
}
// UUID v7 - موصى به لقواعد البيانات
function generateUUIDv7() {
const timestamp = Date.now();
const timeHi = (timestamp >> 16).toString(16).padStart(8, '0');
const timeLow = (timestamp & 0xFFFF).toString(16).padStart(4, '0');
const randomBytes = crypto.getRandomValues(new Uint8Array(10));
const randomHex = Array.from(randomBytes)
.map(b => b.toString(16).padStart(2, '0'))
.join('');
return `${timeHi}-${timeLow}-7${randomHex.substr(0, 3)}-${randomHex.substr(3, 4)}-${randomHex.substr(7)}`;
}
Python
import uuid
# UUID v4
uuid_v4 = str(uuid.uuid4())
# Output: '6ba7b810-9dad-11d1-80b4-00c04fd430c8'
# UUID v1
uuid_v1 = str(uuid.uuid1())
Java
import java.util.UUID;
// UUID v4
String uuidV4 = UUID.randomUUID().toString();
PHP
// UUID v4 (PHP 7+)
function generateUUID() {
return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
mt_rand(0, 0xffff), mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
mt_rand(0, 0x0fff) | 0x4000,
mt_rand(0, 0x3fff) | 0x8000,
mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
);
}
C#
using System;
// UUID v4
Guid uuid = Guid.NewGuid();
string uuidString = uuid.ToString();
أفضل الممارسات
تخزين UUID في قاعدة البيانات
PostgreSQL:
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
MySQL 8.0+:
CREATE TABLE users (
id BINARY(16) PRIMARY KEY DEFAULT (UUID_TO_BIN(UUID())),
email VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
نصيحة: في MySQL، قم بتخزين UUID كـ BINARY(16) بدلاً من CHAR(36) لتوفير المساحة وتسريع الفهرسة.
التحقق من صحة UUID
function isValidUUID(uuid) {
const regex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
return regex.test(uuid);
}
تحويل UUID
// إزالة الواصلات
const compact = uuid.replace(/-/g, '');
// إضافة الواصلات مرة أخرى
function formatUUID(compactUuid) {
return [
compactUuid.substring(0, 8),
compactUuid.substring(8, 12),
compactUuid.substring(12, 16),
compactUuid.substring(16, 20),
compactUuid.substring(20, 32)
].join('-');
}
حل المشكلات (Troubleshooting)
UUID v3/v5 لا يعمل
المشكلة: بعد اختيار v3 أو v5، لا يتم إنشاء شيء
الحل:
- ✅ تأكد من أنك ملأت حقل “الاسم” - إنه إلزامي!
- ✅ اختر المساحة الاسمية الصحيحة وفقًا لنوع إدخالك
- ✅ أمثلة للإدخالات الصالحة:
- DNS:
example.com,google.com - URL:
https://example.com/page - أي نص:
my-app-v1
- DNS:
نصيحة: جرب قيمة بسيطة أولاً مثل test والمساحة الاسمية DNS.
UUIDs الزمنية (v1, v6, v7) لها وقت غريب
المشكلة: UUID الذي تم إنشاؤه له طابع زمني غير متوقع
الحل:
- ✅ تحقق من منتقي التاريخ والوقت - هل الوقت مضبوط بشكل صحيح؟
- ✅ يستخدم منتقي التاريخ والوقت منطقتك الزمنية المحلية
- ✅ اترك منتقي التاريخ والوقت فارغًا للوقت الحالي
لا يمكن نسخ UUID
المشكلة: زر “نسخ الكل” لا يعمل
الحل:
- ✅ تحقق من أنك أنشأت UUIDs (ليست فارغة)
- ✅ تتطلب بعض المتصفحات HTTPS لواجهة برمجة تطبيقات الحافظة
- ✅ بدلاً من ذلك، حدد النص في مربع النص وانسخه يدويًا (Ctrl+C)
الأسئلة الشائعة (FAQ)
هل يمكن أن يحدث اصطدام UUID؟
نظريًا نعم، ولكن الاحتمال صغير للغاية. عند إنشاء مليار UUID v4 في الثانية لمدة 100 عام، فإن فرصة الاصطدام تبلغ حوالي 0.00000006%. عمليًا، لا يحدث اصطدام أبدًا.هل UUID مناسب كمفتاح أساسي في قاعدة البيانات؟
يعتمد ذلك على حالة الاستخدام. UUID مثالي للأنظمة الموزعة والحالات التي تحتاج فيها إلى تفرد عالمي. بالنسبة للتطبيقات البسيطة ذات قاعدة بيانات واحدة، قد يكون التزايد التلقائي أكثر كفاءة.هل UUIDs التي تم إنشاؤها بواسطة هذه الأداة آمنة؟
نعم، نحن نستخدم Web Crypto API (`crypto.getRandomValues()`)، والتي توفر قيمًا عشوائية آمنة من الناحية التشفيرية. كل شيء يحدث محليًا في متصفحك.ما هو الفرق بين إصدارات UUID؟
- **v1**: طابع زمني + MAC/عشوائي - ترتيب زمني، أداء قاعدة بيانات أسوأ - **v3/v5**: مستند إلى التجزئة - حتمي، لتحويل المعرفات المعروفة - **v4**: عشوائي - الأكثر أمانًا، الأكثر استخدامًا - **v6**: طابع زمني معاد ترتيبه - أداء قاعدة بيانات أفضل من v1 - **v7**: طابع زمني Unix - أفضل أداء لقاعدة بيانات + ترتيب زمنيأي إصدار من UUID يجب أن أستخدم؟
بالنسبة لمعظم الحالات، استخدم **v4** (عشوائي). لقواعد البيانات ذات الترتيب الزمني، استخدم **v7** (حديث) أو **v6** (قياسي). لتحويل المعرفات المعروفة (URL، DNS)، استخدم **v5** (SHA-1).هل يمكنني استخدام UUID للرموز المميزة ومفاتيح API؟
UUID v4 مناسب لمعرفات الجلسة والرموز المميزة المماثلة. بالنسبة لمفاتيح API، ضع في اعتبارك استخدام سلاسل عشوائية أطول (مثل قيم 256 بت) أو مكتبات متخصصة.ما هو حجم UUID؟
UUID هو 128 بت (16 بايت). في تنسيق السلسلة مع الواصلات، يشغل 36 حرفًا. بدون واصلات، 32 حرفًا سداسيًا عشريًا.بدائل لـ UUID
ULID (معرف فريد عالميًا قابل للفرز أبجديًا)
- معرف 128 بت (مثل UUID)
- قابل للفرز أبجديًا حسب وقت الإنشاء
- تمثيل أكثر إيجازًا (26 حرفًا بدلاً من 36)
- ترميز base32 غير حساس لحالة الأحرف
مثال: 01ARZ3NDEKTSV4RRFFQ69G5FAV
NanoID
- حجم أصغر من UUID (21 حرفًا قياسيًا)
- صديق لـ URL (بدون أحرف خاصة)
- إنشاء أسرع
- طول وأبجدية قابلة للتكوين
مثال: V1StGXR8_Z5jdHi6B-myT
Snowflake ID (تويتر)
- معرف 64 بت (أصغر من UUID)
- قابل للفرز زمنيًا
- يحتوي على معرف عامل ورقم تسلسلي
- يتطلب تكوينًا مركزيًا
مثال: 1234567890123456789
الأداء والتحسين
سرعة الإنشاء
يمكن للمولد الخاص بنا إنشاء:
- 1 UUID: < 1 مللي ثانية
- 100 UUID: ~10-20 مللي ثانية
- 1000 UUID: ~100-200 مللي ثانية
نصائح للأداء
- الإنشاء الدفعي – إذا كنت تحتاج إلى العديد من UUIDs، فأنشئها دفعة واحدة بدلاً من واحدة تلو الأخرى
- التخزين في DB – فهرس أعمدة UUID للبحث السريع
- الضغط – قم بتخزين UUID في شكل ثنائي (16 بايت) بدلاً من سلسلة نصية (36 بايت)
- التخزين المؤقت – في بعض الحالات، يمكنك إنشاء UUIDs مسبقًا وتخزينها مؤقتًا
للمطورين
بنية UUID v4
xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
| | | | |
| | | | └─ 48 بت من البيانات العشوائية (عقدة)
| | | └────── 16 بت من البيانات العشوائية مع متغير (clock_seq)
| | └─────────── 12 بت من البيانات العشوائية + 4 بتات من الإصدار (time_hi_and_version)
| └──────────────── 16 بت من البيانات العشوائية (time_mid)
└───────────────────────── 32 بت من البيانات العشوائية (time_low)
- الإصدار (4 بتات): دائمًا
0100(ثنائي) =4(سداسي عشري) - المتغير (2-3 بتات): دائمًا
10(ثنائي) لـ RFC 4122
اختبار UUID
// Jest test
describe('UUID Generator', () => {
test('generates valid UUID v4', () => {
const uuid = generateUUIDv4();
const regex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
expect(regex.test(uuid)).toBe(true);
});
test('generates unique UUIDs', () => {
const uuid1 = generateUUIDv4();
const uuid2 = generateUUIDv4();
expect(uuid1).not.toBe(uuid2);
});
});
الجوانب الأمنية
ما لا يجب فعله بـ UUID
❌ لا تستخدم UUID v1 للتطبيقات الحساسة – يحتوي على طابع زمني، مما قد يشكل خطرًا أمنيًا
❌ لا تستخدم Math.random() لإنشاء UUID – ليس آمنًا من الناحية التشفيرية
❌ لا تعتمد على UUID للتفويض – يمكن تخمين UUID (وإن كان باحتمال صغير للغاية)
❌ لا تخزن UUID في ملفات تعريف الارتباط دون تشفير – استخدم ملفات تعريف الارتباط الموقعة أو JWT
ما يجب فعله
✅ استخدم UUID v4 لمعظم الحالات – أعلى إنتروبيا وأمان
✅ اجمع بين UUID وإجراءات أمنية أخرى – لإدارة الجلسة، استخدم HTTPS، ملفات تعريف الارتباط HttpOnly، وانتهاء صلاحية قصير
✅ تحقق من صحة UUID على الخادم – تحقق دائمًا من تنسيق وإصدار UUID
✅ استخدم مصادر عشوائية آمنة تشفيريًا – crypto.getRandomValues() في المتصفح، /dev/urandom على لينكس
حقائق مثيرة للاهتمام
- عدد UUIDs v4 الممكنة: 2^122 ≈ 5.3 × 10^36 (340 undecillion)
- الاصطدام اللازم: للحصول على فرصة اصطدام بنسبة 50%، يجب عليك إنشاء 2.71 × 10^18 UUID (2.71 كوينتيليون)
- حجم جميع UUIDs الممكنة: إذا قمنا بتخزين كل UUID كـ 16 بايت، فإن المساحة الإجمالية ستبلغ 85 زيتابايت (85 مليار تيرابايت)
- الأصل: تم توحيد UUID كجزء من DCE (بيئة الحوسبة الموزعة) في عام 1990