Go में रैंडम स्ट्रिंग जनरेशन: कोड के साथ पूर्ण गाइड

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Go में रैंडम स्ट्रिंग कैसे जनरेट करें और परेशान न हों?

\n\n

क्या आपने कभी ऐसी स्थिति का सामना किया है जहाँ आपको जल्दी से एक अद्वितीय पहचानकर्ता, अस्थायी पासवर्ड या API के लिए टोकन बनाने की आवश्यकता हो? यदि आप Go में लिख रहे हैं, तो देर-सबेर आपके सामने यह प्रश्न आएगा: "निश्चित लंबाई की रैंडम स्ट्रिंग कैसे जनरेट करें?" इस प्रश्न ने Stack Overflow पर हज़ारों बार देखा गया है, और यह उचित भी है - यह सरल लगने वाला कार्य कई छिपी हुई चुनौतियाँ प्रस्तुत करता है।

\n\n

इस लेख में हम Go में रैंडम स्ट्रिंग जनरेशन को सरल समाधानों से लेकर production-ready दृष्टिकोणों तक समझेंगे। आप जानेंगे कि math/rand खतरनाक क्यों हो सकता है, सुरक्षा के लिए crypto/rand का उपयोग कैसे करें, और बिना अतिरिक्त निर्भरता के सुरुचिपूर्ण कोड कैसे लिखें।

\n\n

पासवर्ड के लिए math/rand का उपयोग क्यों न करें?

\n\n

चलिए सबसे लोकप्रिय, लेकिन हमेशा सही न होने वाले समाधान से शुरू करते हैं। कई शुरुआती कुछ इस प्रकार लिखते हैं:

\n\n
package main\n\nimport (\n    "math/rand"\n    "time"\n)\n\nconst letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"\n\nfunc RandString(n int) string {\n    b := make([]byte, n)\n    for i := range b {\n        b[i] = letters[rand.Intn(len(letters))]\n    }\n    return string(b)\n}\n\nfunc main() {\n    rand.Seed(time.Now().UnixNano())\n    println(RandString(10))\n}
\n\n

यह कोड काम करता है, लेकिन इसमें एक गंभीर कमी है: math/rand एक नियतात्मक एल्गोरिदम का उपयोग करता है। यदि कोई हमलावर seed (या जनरेशन का समय) जान लेता है, तो वह पूरे अनुक्रम को पुन: उत्पन्न कर सकता है। परीक्षण डेटा या फ़ाइल नामों के लिए यह ठीक है, लेकिन गुप्त टोकन और पासवर्ड के लिए बिल्कुल नहीं।

\n\n

crypto/rand का उपयोग: Go में सुरक्षित रैंडम स्ट्रिंग जनरेशन

\n\n

production वातावरण के लिए सही विकल्प crypto/rand पैकेज है। यह ऑपरेटिंग सिस्टम के क्रिप्टोग्राफिक रूप से सुरक्षित रैंडम नंबर जनरेटर का उपयोग करता है। crypto/rand के साथ Go में रैंडम स्ट्रिंग जनरेशन इस प्रकार दिखता है:

\n\n
package main\n\nimport (\n    "crypto/rand"\n    "math/big"\n)\n\nconst charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()"\n\nfunc SecureRandomString(length int) (string, error) {\n    result := make([]byte, length)\n    for i := range result {\n        num, err := rand.Int(rand.Reader, big.NewInt(int64(len(charset))))\n        if err != nil {\n            return "", err\n        }\n        result[i] = charset[num.Int64()]\n    }\n    return string(result), nil\n}\n\nfunc main() {\n    str, err := SecureRandomString(16)\n    if err != nil {\n        panic(err)\n    }\n    println(str)\n}
\n\n

ध्यान दें: हम rand.Int का उपयोग rand.Reader के साथ कर रहे हैं - यह गारंटी देता है कि प्रत्येक वर्ण यादृच्छिक और अप्रत्याशित रूप से चुना जाता है। Go में रैंडम स्ट्रिंग के लिए यह स्वर्ण मानक है।

\n\n

प्रदर्शन अनुकूलन: जनरेशन को कैसे तेज़ करें

\n\n

प्रत्येक वर्ण के लिए rand.Int को कॉल करने वाला लूप सैकड़ों हज़ारों स्ट्रिंग जनरेट करते समय धीमा हो सकता है। समाधान - सभी रैंडम बाइट्स को एक बार में जनरेट करें, फिर उन्हें हमारे वर्णमाला पर मैप करें। यह ट्रिक Stack Overflow पर Golang random string के संदर्भ में अक्सर चर्चा की जाती है:

\n\n
package main\n\nimport (\n    "crypto/rand"\n    "encoding/binary"\n)\n\nconst charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"\n\nfunc FastRandomString(length int) string {\n    result := make([]byte, length)\n    // रैंडम 64-बिट संख्याएँ जनरेट करें\n    buf := make([]byte, 8*length)\n    if _, err := rand.Read(buf); err != nil {\n        panic(err)\n    }\n    for i := 0; i < length; i++ {\n        // प्रत्येक वर्ण के लिए 8 बाइट लें\n        val := binary.LittleEndian.Uint64(buf[i*8 : (i+1)*8])\n        // मॉड्यूलो का उपयोग करके पूर्वाग्रह (bias) से बचें\n        result[i] = charset[val%uint64(len(charset))]\n    }\n    return string(result)\n}\n\nfu                

ब्लॉग

पुस्तक अनुशंसाएँ