كيفية توليد سلسلة من الأحرف العشوائية في JavaScript؟ من البسيط إلى الآمن
\n\nتخيل: أنت تكتب نموذج تسجيل، وتحتاج إلى توليد كلمة مرور مؤقتة لمستخدم جديد. أو ربما تقوم بإنشاء معرف فريد لجلسة، أو مفتاح تنشيط، أو مجرد اسم ملف عشوائي على الخادم. في كل هذه الحالات، يطرح نفس السؤال: كيف يمكن توليد سلسلة من الأحرف العشوائية في JavaScript بسرعة وموثوقية؟
\n\nهذا السؤال هو أحد أكثر الأسئلة شيوعًا على Stack Overflow (آلاف المشاهدات وعشرات الإجابات المتنوعة). ولكن أي نهج تختار؟ في هذه المقالة، سنستعرض 5 طرق حقيقية لتوليد سلاسل عشوائية، من الأبسط إلى الآمن تشفيريًا، وستفهم متى تستخدم أي طريقة.
\n\nهيا بنا! 🚀
\n\nالطريقة 1: الكلاسيكية — Math.random() و toString(36)
\n\nالطريقة الأكثر إيجازًا، والتي تظهر غالبًا في إجابات Stack Overflow، هي استخدام Math.random() مع toString(36).
كيف تعمل؟ Math.random() تُرجع رقمًا من 0 (شامل) إلى 1 (غير شامل). طريقة .toString(36) تحول هذا الرقم إلى سلسلة نصية ذات أساس 36، أي تستخدم الأرقام 0–9 والحروف a–z. مثالية للحصول على نتيجة سريعة!
function randomString(length) {\n let result = '';\n const characters = 'abcdefghijklmnopqrstuvwxyz0123456789';\n const charactersLength = characters.length;\n for (let i = 0; i < length; i++) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\n }\n return result;\n}\n\nconsole.log(randomString(10)); // مثال: "a3f8k2m9x1"\n\n\nمزايا وعيوب هذا النهج
\n- \n
- المزايا: البساطة، الوضوح، يعمل في أي متصفح و Node.js. \n
- العيوب: غير مناسب للتشفير (كلمات المرور، الرموز المميزة).
Math.random()ليس آمنًا تشفيريًا — يمكن توقعه. \n
متى تستخدم: لتوليد معرفات عشوائية في المشاريع التعليمية، أو أسماء الملفات، أو بيانات الاختبار. للإنتاج — فقط إذا كانت الأمان غير مهم.
\n\nالطريقة 2: سطر واحد قصير (ولكن مع فارق)
\n\nهناك خدعة شائعة على الإنترنت:
\n\nconst randomStr = (length) => Math.random().toString(36).substring(2, 2 + length);\nconsole.log(randomStr(8)); // مثال: "n4k9v3m2"\n\n\nتبدو جميلة، ولكن هناك مشكلة. Math.random().toString(36) يعطي سلسلة بطول حوالي 11–15 حرفًا. إذا كنت بحاجة إلى 20 حرفًا — هذه الطريقة لن تعمل. بالإضافة إلى ذلك، لا تزال غير آمنة.
الخلاصة: جيدة للنماذج الأولية السريعة، ولكن ليس للمهام الجادة.
\n\nالطريقة 3: أبجدية موسعة والتحكم في الأحرف
\n\nماذا لو كنت بحاجة إلى أحرف وأرقام ورموز خاصة؟ أو على العكس، تحتاج إلى استبعاد الأحرف المتشابهة (مثل 0 و O، 1 و l)؟ لهذا، نكتب المولد الخاص بنا مع مجموعة أحرف مرنة.
function generateSecureString(length, includeSpecial = false) {\n let chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n if (includeSpecial) {\n chars += '!@#$%^&*()_+-=[]{}|;:,./<>?';\n }\n let result = '';\n const charsLength = chars.length;\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * charsLength));\n }\n return result;\n}\n\nconsole.log(generateSecureString(12, true)); // مثال: "A3f!k2M9x1#"\n\n\nلماذا هذا مفيد؟
\n- \n
- أنت تتحكم بنفسك في مجموعة الأحرف. \n
- يمكن استبعاد الأحرف غير القابلة للقراءة (مثل رموز التأكيد). \n
- سهولة إضافة دعم الأرقام والأحرف الكبيرة والصغيرة. \n
لكن تذكر: Math.random() لا يزال غير آمن تشفيريًا. لكلمات المرور، من الأفضل استخدام