जावा में रैंडम स्ट्रिंग जनरेशन: अव्यवस्था से प्रदर्शन तक

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

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

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

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

\n\n

कल्पना करें: आप एक वेबसाइट पर रजिस्ट्रेशन लिख रहे हैं। ईमेल पुष्टि के लिए एक अद्वितीय टोकन बनाना आवश्यक है। या किसी नए उपयोगकर्ता के लिए पासवर्ड जनरेट करना है। या बस एक लिंक के लिए पढ़ने योग्य ID बनाना है। सबसे पहले जो विचार आता है वह है UUID.randomUUID() लेना, डैश हटाना और जीवन का आनंद लेना।

\n\n

रुकिए। क्या आप जानते हैं कि पहली नज़र में सरल लगने वाली यह क्रिया प्रदर्शन का अड़चन बन सकती है? Stack Overflow पर "How to generate a random alpha-numeric string" प्रश्न ने हज़ारों बार देखा गया है, यह व्यर्थ नहीं है। शैतान, हमेशा की तरह, विवरणों में छिपा है: रैंडम नंबर जनरेटर का चयन, एल्गोरिदम, मेमोरी के साथ काम। इस लेख में हम केवल कोड नहीं लिखेंगे - हम इसे अधिकतम तक ऑप्टिमाइज़ करेंगे।

\n\n

IntelliJ IDEA तैयार करें। चलिए शुरू करते हैं!

\n\n

1. सबसे सरल (लेकिन धीमा) तरीका: UUID

\n\n

क्लासिक से शुरू करते हैं। UUID 128-बिट मान जनरेट करता है। यदि डैश हटा दें, तो हेक्स फॉर्मेट (0-9, a-f) में 32 अक्षर मिलते हैं। यह पहले से ही एक अल्फ़ान्यूमेरिक स्ट्रिंग है, लेकिन सीमित वर्णमाला के साथ।

\n\n
public static String generateWithUUID() {\n    return UUID.randomUUID().toString().replace("-", "");\n}\n
\n\n

लाभ: कोड की एक पंक्ति। सोचने की आवश्यकता नहीं।

\n

नुकसान: लंबाई को नियंत्रित नहीं किया जा सकता। केवल हेक्स अक्षर (16 वर्णों की वर्णमाला)। पासवर्ड के लिए - कमज़ोर। टोकन के लिए - चल सकता है, लेकिन एक बारीकी है।

\n\n

वैसे, UUID.randomUUID() अंदरूनी रूप से SecureRandom का उपयोग करता है। यह क्रिप्टोग्राफिक रूप से सुरक्षित है, लेकिन धीमा है। यदि आपको प्रति सेकंड 10,000 स्ट्रिंग चाहिए - यह विधि आपको निराश करेगी।

\n\n

2. Apache Commons Lang से RandomStringUtils

\n\n

क्लासिक जो एक प्रोजेक्ट से दूसरे में जाता है। लाइब्रेरी commons-lang3 एक तैयार विधि प्रदान करती है:

\n\n
import org.apache.commons.lang3.RandomStringUtils;\n\npublic static String generateWithCommons(int length) {\n    return RandomStringUtils.randomAlphanumeric(length);\n}\n
\n\n

सुंदर? हाँ। प्रदर्शनकारी? बहुत नहीं।

\n

अंदरूनी रूप से RandomStringUtils java.util.Random (क्रिप्टोग्राफिक रूप से सुरक्षित नहीं) का उपयोग करता है और बहुत सारे अस्थायी ऑब्जेक्ट बनाता है। अधिकांश कार्यों के लिए पर्याप्त होगा, लेकिन यदि आप लाखों स्ट्रिंग जनरेट कर रहे हैं - GC-पॉज़ के लिए तैयार रहें।

\n\n

3. Random.nextInt() के साथ कस्टम विधि

\n\n

चलिए अपना खुद का पहिया बनाते हैं। सबसे स्पष्ट तरीका:

\n\n
import java.security.SecureRandom;\nimport java.util.Random;\n\npublic class RandomStringGenerator {\n    private static final String ALPHANUMERIC = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";\n    private static final int BASE = ALPHANUMERIC.length();\n    private final Random random;\n\n    public RandomStringGenerator() {\n        this.random = new SecureRandom(); // क्रिप्टोग्राफिक सुरक्षा के लिए\n    }\n\n    public String generate(int length) {\n        StringBuilder sb = new StringBuilder(length);\n        for (int i = 0; i < length; i++) {\n            sb.append(ALPHANUMERIC.charAt(random.nextInt(BASE)));\n        }\n        return sb.toString();\n    }\n}\n
\n\n

यहाँ क्या महत्वपूर्ण है?

\n
    \n
  • हम ज्ञात क्षमता वाले StringBuilder का उपयोग कर रहे हैं - कोई अनावश्यक विस्तार नहीं होगा।
  • \n
  • SecureRandom गारंटी देता है कि आउटपुट का अनुमान नहीं लगाया जा सकता। टोकन के लिए - अनिवार्य।
  • \n
  • वर्णमाला एक स्ट्रिंग के रूप में दी गई है - 62 अक्षर (26+26+10)। विशेष वर्ण जोड़े जा सकते हैं।
  • \n
\n\n

लेकिन एक समस्या है: SecureRandom Linux पर धीमा हो सकता है (एंट्रॉपी की प्रतीक्षा)। यदि गति सुरक्षा से अधिक महत्वपूर्ण है - ThreadLocalRandom.current() का उपयोग करें।

\n\n

4. char[] और ThreadLocalRandom के साथ ऑप्टिमाइज़ेशन

\n\n

अधिकतम निचोड़ना चाहते हैं? StringBuilder को छोड़ें और सीधे कैरेक्टर ऐरे के साथ काम करें:

\n\n
import java.util.concurrent.ThreadLocalR                

ब्लॉग

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