مولد 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 حسب وقت إنشاء السجل
  • إنشاء معرفات بأثر رجعي

مثال للاستخدام:

  1. اختر الإصدار v1 أو v6 أو v7
  2. اضبط التاريخ والوقت باستخدام منتقي التاريخ والوقت
  3. أنشئ UUID مع الطابع الزمني المخصص لك

UUID المستندة إلى التجزئة (v3, v5)

بالنسبة لـ UUIDs الحتمية، يمكنك استخدام الإصدارين v3 (MD5) أو v5 (SHA-1):

كيفية الاستخدام:

  1. اختر المساحة الاسمية وفقًا لنوع معرفك
  2. أدخل الاسم/القيمة
  3. أنشئ UUID

أمثلة:

المساحة الاسميةالاسم (الإدخال)الاستخدام
DNSexample.comتحويل اسم النطاق إلى UUID
DNSgoogle.comكل موقع ويب له UUID فريد
URLhttps://example.com/pageتحويل URL إلى UUID
URLhttps://api.example.com/users/123نقطة نهاية API كـ UUID
OID1.3.6.1.4.1.343معرف الكائن إلى UUID
X.500CN=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 v416 بايتمستحيل عمليًاأنظمة موزعة، API
UUID v716 بايتمستحيل عمليًاقاعدة بيانات حديثة ذات أداء
ULID16 بايتمستحيل عمليًاUUID + ترتيب أبجدي
Snowflake ID8 بايتفريد مضمون عند التكوين الصحيحتويتر، أنظمة موزعة
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، لا يتم إنشاء شيء

الحل:

  1. ✅ تأكد من أنك ملأت حقل “الاسم” - إنه إلزامي!
  2. ✅ اختر المساحة الاسمية الصحيحة وفقًا لنوع إدخالك
  3. ✅ أمثلة للإدخالات الصالحة:
    • DNS: example.com, google.com
    • URL: https://example.com/page
    • أي نص: my-app-v1

نصيحة: جرب قيمة بسيطة أولاً مثل test والمساحة الاسمية DNS.

UUIDs الزمنية (v1, v6, v7) لها وقت غريب

المشكلة: UUID الذي تم إنشاؤه له طابع زمني غير متوقع

الحل:

  1. ✅ تحقق من منتقي التاريخ والوقت - هل الوقت مضبوط بشكل صحيح؟
  2. ✅ يستخدم منتقي التاريخ والوقت منطقتك الزمنية المحلية
  3. ✅ اترك منتقي التاريخ والوقت فارغًا للوقت الحالي

لا يمكن نسخ UUID

المشكلة: زر “نسخ الكل” لا يعمل

الحل:

  1. ✅ تحقق من أنك أنشأت UUIDs (ليست فارغة)
  2. ✅ تتطلب بعض المتصفحات HTTPS لواجهة برمجة تطبيقات الحافظة
  3. ✅ بدلاً من ذلك، حدد النص في مربع النص وانسخه يدويًا (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 مللي ثانية

نصائح للأداء

  1. الإنشاء الدفعي – إذا كنت تحتاج إلى العديد من UUIDs، فأنشئها دفعة واحدة بدلاً من واحدة تلو الأخرى
  2. التخزين في DB – فهرس أعمدة UUID للبحث السريع
  3. الضغط – قم بتخزين UUID في شكل ثنائي (16 بايت) بدلاً من سلسلة نصية (36 بايت)
  4. التخزين المؤقت – في بعض الحالات، يمكنك إنشاء 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