توليد سلاسل عشوائية في C#: من المبتدئ إلى المحترف

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

كيف تعبت من البحث عن "random alphanumeric string C#" وكتبت هذا المقال

\n\n

اعترف بصراحة: عندما احتجت مرة أخرى لتوليد كود تفعيل عشوائي، أو كلمة مرور مؤقتة، أو معرف فريد لجلسة، هل قمت فقط بنسخ أول إجابة من Stack Overflow؟ أنا أيضًا كنت أفعل ذلك. لكن المشكلة أن توليد سلاسل أبجدية رقمية عشوائية في C# ليست مهمة واحدة، بل مجموعة من السيناريوهات. وما يصلح لرمز اختباري قد يفشل في تدقيق أمان الإنتاج.

\n\n

في هذا المقال، سنستعرض جميع الطرق الشائعة لـ توليد سلاسل عشوائية في C#. من الحلول البسيطة باستخدام Random إلى الطرق الآمنة تشفيريًا المعتمدة من OWASP. ستعرف أي طريقة تختار لكلمات المرور، وأيها للروابط المختصرة، وأيها من الأفضل نسيانها. هيا بنا!

\n\n

1. الطريقة الأسهل: Random + StringBuilder (لكن هناك ملاحظة)

\n\n

عندما بدأت، كان أول حل لي هو هذا الكود:

\n\n
public static string GenerateRandomString(int length)\n{\n    const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";\n    var random = new Random();\n    var result = new StringBuilder(length);\n    \n    for (int i = 0; i < length; i++)\n    {\n        result.Append(chars[random.Next(chars.Length)]);\n    }\n    \n    return result.ToString();\n}
\n\n

يبدو منطقيًا، أليس كذلك؟ نأخذ الأبجدية، نختار فهرسًا عشوائيًا، نجمع السلسلة. لكن لهذه الطريقة مشكلتان خطيرتان:

\n\n
    \n
  • Random غير آمن — فئة Random ليست آمنة تشفيريًا. إذا عرف المهاجم وقت إنشاء الكائن (وهو سهل)، يمكنه توقع التسلسل بأكمله.
  • \n
  • مشكلة تعدد المهام — إذا استدعى خيطان new Random() بنفس البذرة (وهذا يحدث كثيرًا عند الاستدعاءات المتتالية السريعة)، سيحصلان على نفس السلاسل.
  • \n
\n\n

متى تستخدم: فقط للاختبارات المحلية، توليد أسماء الملفات أو بيانات التصحيح. أبدًا لكلمات المرور، الرموز المميزة أو مفاتيح التشفير.

\n\n

نسخة محسّنة: Random ثابت

\n\n
private static readonly Random _random = new Random();\n\npublic static string GenerateRandomString(int length)\n{\n    const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";\n    var result = new char[length];\n    \n    lock (_random)\n    {\n        for (int i = 0; i < length; i++)\n        {\n            result[i] = chars[_random.Next(chars.Length)];\n        }\n    }\n    \n    return new string(result);\n}
\n\n

أضفنا lock لأمان الخيوط واستبدلنا StringBuilder بمصفوفة char — هذا أسرع. لكن مشكلة التوقع بقيت.

\n\n

2. Guid.NewGuid(): سلسلة عشوائية بسطر واحد

\n\n

عندما رأيت هذه الحيلة لأول مرة، فكرت: "عبقري!"

\n\n
string randomString = Guid.NewGuid().ToString("N").Substring(0, 8);
\n\n

Guid يولد قيمة 128 بت مضمونة تقريبًا أنها فريدة. الطريقة "N" تزيل الشرطات. Substring تقطع إلى الطول المطلوب.

\n\n

الإيجابيات:

\n
    \n
  • كود قصير جدًا
  • \n
  • لا حاجة للتعامل مع الأبجدية
  • \n
  • سرعة عالية
  • \n
\n\n

السلبيات:

\n
    \n
  • Guid يحتوي فقط على أحرف ست عشرية (0-9, a-f) — أبجدية من 16 حرفًا فقط
  • \n
  • ليست كل إصدارات Guid عشوائية حقًا (الإصدار 1 يعتمد على الوقت وعنوان MAC)
  • \n
  • غير مناسب للتشفير — بنية Guid قابلة للتوقع
  • \n
\n\n

متى تستخدم: لتوليد معرفات فريدة لسجلات قاعدة البيانات أو أسماء الملفات المؤقتة. ليس لكلمات المرور.

\n\n

3. Path.GetRandomFileName(): اسم ملف عشوائي

\n\n

قليلون يعلمون أن .NET يحتوي على مولد أسماء ملفات عشوائي مدمج:

\n\n
<                

المدونات

توصيات الكتب