تخطَّ إلى المحتوى

uuid.New / uuid.NewV7

توليد UUID جديد uuid.New / uuid.NewV7

الحزمة القياسية الجديدة uuid (منذ Go 1.27) تولّد UUID بلا مكتبة خارجية — uuid.New لأي غرض عام (نسخة v4 عشوائية)، و uuid.NewV7 لمعرّف مرتّب زمنيًا يناسب مفاتيح قواعد البيانات.

قبل Go 1.27، توليد UUID بـ Go كان يحتاج مكتبة خارجية شائعة مثل google/uuid. الآن الحزمة uuid جزء من المكتبة القياسية، تعتمد داخليًا على crypto/rand لتوليد الجزء العشوائي، وتعرّف النوع UUID كمصفوفة [16]byte قابلة للمقارنة مباشرة بـ ==.

uuid.New() تعادل حاليًا uuid.NewV4() — معرّف بـ 122 بت عشوائية، مناسب لأغلب الأغراض العامة. uuid.NewV7() تولّد معرّفًا يحمل طابعًا زمنيًا بالبتات الأولى (بدقّة أجزاء من الميلي ثانية) تليها بتات عشوائية، بحيث تُرتَّب المعرّفات المتتالية تصاعديًا تلقائيًا حسب وقت التوليد — هذا يحسّن أداء الفهرسة بقاعدة بيانات مقارنة بـ v4 العشوائي بالكامل الذي يبعثر الإدخالات الجديدة عشوائيًا داخل شجرة الفهرس.

الصياغة

func New() UUID       // = NewV4()، عشوائي بالكامل
func NewV4() UUID     // 122 بت عشوائية
func NewV7() UUID     // طابع زمني + عشوائية، مرتّب تصاعديًا

📄 مثال

import "uuid"

id := uuid.New()          // مناسب لغرض عام
fmt.Println(id.String())  // مثال: 550e8400-e29b-41d4-a716-446655440000

sortableID := uuid.NewV7()   // أفضل كمفتاح أساسي بقاعدة بيانات

أهم النقاط

العنصرالوظيفة
UUIDالنوع نفسه [16]byte — قابل للمقارنة مباشرة بـ == ويصلح كمفتاح map
New / NewV4معرّف عشوائي بالكامل، الخيار الافتراضي لأي غرض عام
NewV7يحمل طابعًا زمنيًا فيرتَّب تصاعديًا تلقائيًا — أفضل لأداء الفهرسة كمفتاح أساسي

💡 نصائح عملية

  • استخدم NewV7 تحديدًا لو المعرّف سيصبح مفتاحًا أساسيًا (primary key) بقاعدة بيانات — الترتيب التصاعدي يقلّل تجزّؤ الفهرس مقارنة بـ V4 العشوائي بالكامل

⚠️ أخطاء شائعة

  • الاعتماد على NewV7 لضمان تفرّد مطلق دون تعامل مع احتمال تعارض نادر جدًا عند تشغيل عدّة نسخ من نفس البرنامج بتزامن دقيق للغاية على نفس الميلي ثانية — نادر جدًا لكن ليس مستحيلًا نظريًا
  • مقارنة UUID كنص (u.String() == other.String()) بدل مقارنته مباشرة كقيمة (u == other) أو عبر u.Compare(other) — أبطأ بلا داعٍ

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار GO الكامل بالعربي.