كيف تعبت من البحث عن "random alphanumeric string C#" وكتبت هذا المقال
\n\nاعترف بصراحة: عندما احتجت مرة أخرى لتوليد كود تفعيل عشوائي، أو كلمة مرور مؤقتة، أو معرف فريد لجلسة، هل قمت فقط بنسخ أول إجابة من Stack Overflow؟ أنا أيضًا كنت أفعل ذلك. لكن المشكلة أن توليد سلاسل أبجدية رقمية عشوائية في C# ليست مهمة واحدة، بل مجموعة من السيناريوهات. وما يصلح لرمز اختباري قد يفشل في تدقيق أمان الإنتاج.
\n\nفي هذا المقال، سنستعرض جميع الطرق الشائعة لـ توليد سلاسل عشوائية في C#. من الحلول البسيطة باستخدام Random إلى الطرق الآمنة تشفيريًا المعتمدة من OWASP. ستعرف أي طريقة تختار لكلمات المرور، وأيها للروابط المختصرة، وأيها من الأفضل نسيانها. هيا بنا!
\n\n1. الطريقة الأسهل: Random + StringBuilder (لكن هناك ملاحظة)
\n\nعندما بدأت، كان أول حل لي هو هذا الكود:
\n\npublic 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نسخة محسّنة: Random ثابت
\n\nprivate 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\n2. Guid.NewGuid(): سلسلة عشوائية بسطر واحد
\n\nعندما رأيت هذه الحيلة لأول مرة، فكرت: "عبقري!"
\n\nstring randomString = Guid.NewGuid().ToString("N").Substring(0, 8);\n\nGuid يولد قيمة 128 بت مضمونة تقريبًا أنها فريدة. الطريقة "N" تزيل الشرطات. Substring تقطع إلى الطول المطلوب.
\n\nالإيجابيات:
\n- \n
- كود قصير جدًا \n
- لا حاجة للتعامل مع الأبجدية \n
- سرعة عالية \n
السلبيات:
\n- \n
- Guid يحتوي فقط على أحرف ست عشرية (0-9, a-f) — أبجدية من 16 حرفًا فقط \n
- ليست كل إصدارات Guid عشوائية حقًا (الإصدار 1 يعتمد على الوقت وعنوان MAC) \n
- غير مناسب للتشفير — بنية Guid قابلة للتوقع \n
متى تستخدم: لتوليد معرفات فريدة لسجلات قاعدة البيانات أو أسماء الملفات المؤقتة. ليس لكلمات المرور.
\n\n3. Path.GetRandomFileName(): اسم ملف عشوائي
\n\nقليلون يعلمون أن .NET يحتوي على مولد أسماء ملفات عشوائي مدمج:
\n\n<