Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. PHP
Code

PHP में रैंडम अल्फान्यूमेरिक स्ट्रिंग जेनरेट करें

by
Difficulty:IntermediateLength:MediumLanguages:

Hindi (हिंदी) translation by Ashish Rampal (you can also view the original English article)

मुझे यह कहके यह पोस्ट शुरू करने दें कि लगभग कोई इवेंट वास्तव में रैंडम नहीं है। यहां तक कि एक क्लासिक कॉइन टॉस का परिणाम थ्योरी में भविष्यवाणी की जा सकती है अगर हम शामिल हर फैक्टर के प्रभाव को जानते थे, जैसे फ्रिक्शन, ग्रेविटी, और इनिशियल फाॅर्स।

रैंडम नंबर्स और अल्फान्यूमेरिक स्ट्रिंग्स की जनरेशन के लिए एक जैसी ही बात लागू होती है। सबसे अच्छा हम यह उम्मीद कर सकते हैं कि नंबर्स और स्ट्रिंग जेनेरेट करें जो एक पैटर्न का पालन नहीं करते हैं और अटैकर द्वारा व्यावहारिक रूप से भविष्यवाणी नहीं की जा सकती है।

इस ट्यूटोरियल में, हम PHP में रैंडम नंबर्स और अल्फान्यूमेरिक स्ट्रिंग्स को जेनेरेट करने के लिए विभिन्न तकनीकों को शामिल करेंगे। उनमें से कुछ क्रिप्टोग्राफ़िक से सुरक्षित होंगे, जबकि अन्य केवल कैजुअल उपयोग के लिए हैं, जैसे सूडो-रैंडम फ़ाइल नाम को असाइन करना या URLs बनाना और यूजरनाम सजेस्ट करना।

PHP में रैंडम संख्या जेनेरेट करना

PHP में रैंडम नंबर जेनेरेट करने के लिए तीन अलग-अलग फ़ंक्शन हैं। वे सभी रैंडम नंबर्स के लिए न्यूनतम और अधिकतम संभव वैल्यूज को स्वीकार करेंगे और आपके लिए एक रैंडम नंबर आउटपुट करेंगे। ये rand($min, $max), mt_rand($min, $max), और random_int($min, $max) हैं।

rand() के साथ, इन्टिजर के न्यूनतम और अधिकतम वैल्यू जो आप 0 और getrandmax() द्वारा रीटर्न की गयी वैल्यू के बीच जेनेरेट कर सकते हैं। PHP 7.1.0 से पहले, यह फ़ंक्शन mt_rand() से लगभग चार गुना धीमा था। हालांकि, PHP 7.1.0 से शुरू होने पर, इसे mt_rand() का अलियास बना दिया गया है। mt_rand() के विपरीत, हालांकि, आप एरर के बिना $max से $min तक की वैल्यू सेट कर सकते हैं।

mt_rand() के साथ, इन्टिजर के न्यूनतम और अधिकतम वैल्यू जो आप 0 और mt_getrandmax() द्वारा लौटाए गए रीटर्न के बीच जेनेरेट कर सकते हैं। यह रैंडम वैल्यू जेनेरेट करने के लिए Mersenne Twister के इम्प्लीमेंटेशन पर निर्भर करता है। हालांकि, PHP 7.1.0 से पहले, इस फ़ंक्शन ने नंबर्स जेनेरेट करने के लिए एल्गोरिदम का गलत वर्जन इम्प्लीमेंट किया था। हालांकि, यह नए वर्जन में फिक्स कर दिया गया है।

एक मोडियूलो बायस बग से छुटकारा पाने के द्वारा यह कार्य PHP 7.2.0 में भी बेहतर हो गया। इसका मतलब है कि कुछ विशेष सीड के लिए, रैंडम नंबर्स का आपका सीक्वेंस अब पुराने वर्जन की तुलना में थोड़ा बेहतर होगा। हालांकि, कुछ विशेष कोड वास्तव में इस बायस पर भरोसा कर सकते हैं। यदि ऐसा है, तो आप पुराने सीड एल्गोरिदम का उपयोग mt_srand() फ़ंक्शन को रैंडम नंबर जनरेटर को सीड करके और दूसरे पैरामीटर की वैल्यू के रूप में MT_RAND_PHP को पास करके कॉल करके कर सकते हैं।

mt_rand() फ़ंक्शन की अवधि 219937-1 है, जिसका मूल रूप से अर्थ है कि सीक्वेंस प्रारंभ होने से पहले आपको सर्वोत्तम स्थिति सिनेरियो में 219937-1 रैंडम नंबर्स मिलते हैं। आपको ध्यान रखना चाहिए कि सीक्वेंस की पुनरावृत्ति किसी विशेष नंबर की पुनरावृत्ति के समान नहीं है। दूसरे शब्दों में, आपको एक ही रैंडम नंबर दो बार मिल सकते है, लेकिन इसका मतलब यह नहीं है कि सीक्वेंस ने स्वयं को दोहराना शुरू कर दिया है। निम्नलिखित सीक्वेंस एक उदाहरण है:

उपर्युक्त सीक्वेंस में, हमारे आउटपुट में 1267 दो बार था, लेकिन इसका मतलब यह नहीं है कि पूरे सीक्वेंस बाद में दोहराना शुरू हो गया। रैंडम सीक्वेंस में इतनी जल्दी उसी नंबर को दोहराने की संभावना नहीं है, लेकिन यह संभव है!

क्रिप्टोग्राफिक रूप से सुरक्षित रैंडम इंटीजर

यदि आप क्रिप्टोग्राफ़िक रूप से सुरक्षित सूडो-रैंडम नंबर चाहते हैं, तो PHP में random_int() फ़ंक्शन आपकी सबसे अच्छी चीज है। यह प्रदान किए गए $min और $max वैल्यूज के बीच रैंडम नंबर जेनेरेट करेगा, जो डिफ़ॉल्ट रूप से PHP_INT_MIN और PHP_INT_MAX के लिए होगा। दुर्भाग्यवश, यह फ़ंक्शन केवल PHP 7.0 से शुरू हो रहा है। इससे पहले के वर्जन के लिए, आप इस GitHub में polyfill का उपयोग कर सकते हैं।

रैंडम फ्लोट्स

रैंडम इन्टिजर जेनेरेट करने के बजाय, आप शायद फ्लोट जेनेरेट करना चाहें। यह mt_getrandmax() द्वारा रीटर्न की गयी वैल्यू के साथ रैंडम नंबर को आसानी से विभाजित करके आसानी से किया जा सकता है। निम्नलिखित उदाहरण बताएगा कि 0 और 1 के बीच या किसी अन्य न्यूनतम और अधिकतम लिमिट्स के बीच एक रैंडम फ्लोट कैसे जेनेरेट करें।

दी गई लिमिट्स के बीच एक रैंडम फ्लोट जेनेरेट करते समय, हम सुनिश्चित करते हैं कि रैंडम इन्टिजर नंबर अधिकतम $max - 1 से ऊपर नहीं जाते है। इस तरह, हम यह सुनिश्चित कर सकते हैं कि फ़्लोट के भाग को जोड़ना अधिकतम सीमा से ऊपर नहीं लेगा।

रैंडम नंबर जेनरेटर को सीड करना

एक अवधारणा जिसे थोड़ा से स्पष्टीकरण की आवश्यकता है seed है। सिंपल करके रखें, ये केवल नंबर्स हैं जिनका उपयोग किसी भी रैंडम नंबर जेनेरेट करने से पहले rand() और mt_rand() फ़ंक्शंस को प्रारंभ करने के लिए किया जा सकता है। फ़ंक्शन जो rand() को सीड करते हैं उन्हें srand($seed) कहा जाता है, और जो फंक्शन mt_rand() को सीड करता है उसे mt_srand($seed, $mode) कहा जाता है।

यह याद रखना महत्वपूर्ण है कि rand() और mt_rand() को कॉल करने से पहले प्रत्येक बार प्रारंभिक सीड वैल्यू प्रदान करना आवश्यक रूप से बेहतर रैंडम नंबर जेनेरेट नहीं करेगा। वास्तव में, प्रत्येक बार एक ही सीड का उपयोग करके आपको वही रैंडम नंबर भी मिल जाएगा!

रैंडम नंबर की सीडिंग उन परिस्थितियों में उपयोगी होती है जहां आप एक रैंडम लेकिन पुनरुत्पादित (reproducible) सीक्वेंस जेनेरेट करना चाहते हैं। निम्न कोड स्निपेट दो बार चलाने पर रैंडम नंबर्स के समान सीक्वेंस को जेनेरेट करता है।

पुनरुत्पादित रैंडम सीक्वेंस जेनेरेट करने से इस तरह से डीबग प्रोग्रामों की मदद मिल सकती है, जिन्हें रैंडम डेटा का उपयोग करके टेस्ट किया जा रहा था-यदि आप सीड का ट्रैक रखते हैं, तो आप यह पता लगाने के लिए एक ही इनपुट को रीप्रोडूस कर सकते हैं कि क्या गलत हुआ।

PHP में रैंडम अल्फान्यूमेरिक स्ट्रिंग जेनरेट करना

रैंडम अल्फान्यूमेरिक स्ट्रिंग जेनेरेट करने के कई तरीके हैं, और आप जो भी उपयोग करते हैं वह आपकी आवश्यकताओं पर निर्भर करेगा।

शफल स्ट्रिंग जेनेरेट करें

यदि आप करैक्टर के एक निश्चित सेट से रैंडम अल्फान्यूमेरिक स्ट्रिंग जेनेरेट करना चाहते हैं, तो आप str_shuffle($string) फ़ंक्शन का उपयोग कर सकते हैं। यह फ़ंक्शन आपको रैंडम रूप से शफल स्ट्रिंग प्रदान करेगा। PHP 7.1 से शुरू होने पर, एल्गोरिदम जो आउटपुट स्ट्रिंग में करैक्टर के रैंडम आर्डर को निर्धारित करता है उसे Mersenne Twister में बदल दिया गया है।

याद रखें कि इस तरह से जेनेरेट की गयी रैंडम स्ट्रिंग क्रिप्टोग्राफ़िक रूप से सुरक्षित नहीं होती। हालांकि, स्ट्रिंग अभी भी सामान्य उपयोग के लिए बहुत अप्रत्याशित (unpredictable) होगी जैसे कि रैंडम फ़ाइल नाम या URL जेनेरेट करना। कुछ उदाहरण निम्नलिखित हैं:

आपका आउटपुट शायद दोनों मामलों में अलग होगा। पहले मामले में, हमने केवल परमिट किये गए करैक्टर स्ट्रिंग को शफल किया और फिर इसके पहले 10 अक्षरों को लिया। दूसरे मामले में, हमने जेनरेट की गयी स्ट्रिंग की शुरुआत में "video" और अंत में ".mp4" जोड़ा।

रैंडम अल्फान्यूमेरिक स्ट्रिंग जेनेरेट करने का यह मेथड बहुत आसान है, लेकिन इसमें कुछ समस्याएं हैं। उदाहरण के लिए, आपको दो बार अपनी रैंडम स्ट्रिंग में एक ही करैक्टर नहीं मिलेगा। साथ ही, रैंडम आउटपुट स्ट्रिंग की लंबाई केवल इनपुट स्ट्रिंग तक ही हो सकती है।

रैंडम स्ट्रिंग जेनेरेट करें

यदि ऊपर लिस्ट की गयी समस्याएं एक डील ब्रेकर हैं, तो आप कुछ अन्य इम्प्लीमेंटेशन को देखना चाहेंगे। निम्नलिखित कोड इन दोनों समस्याओं को हल करेगा।

आप जेनरेट की गई रैंडम स्ट्रिंग में विशेष सफिक्स और प्रीफिक्स जोड़ने के लिए इसे मॉडिफाई कर सकते हैं। जो लोग PHP 7 का उपयोग कर रहे हैं वे mt_rand() के बजाय क्रिप्टोग्राफ़िक रूप से सुरक्षित फ़ंक्शन random_int() का उपयोग कर स्ट्रिंग जनरेशन को और बेहतर बना सकते हैं।

रैंडम हेक्साडेसिमल स्ट्रिंग जेनेरेट करें

यदि आप PHP में रैंडम हेक्साडेसिमल स्ट्रिंग जेनेरेट करना चाहते हैं, तो आप या तो md5($string, $raw_output) या sha1($string, $raw_output) फ़ंक्शन का उपयोग कर सकते हैं। ये दोनों एक दिए गए इनपुट स्ट्रिंग के हैश (hash) जेनेरेट करेंगे।

इनपुट यूनिक होने तक आप यूनिक हैश को प्राप्त करते रहेंगे। यह इनपुट के रूप में time() जैसे फ़ंक्शन के आउटपुट का उपयोग कर हासिल किया जा सकता है। डिफ़ॉल्ट रूप से, md5() 32-करैक्टर की हेक्साडेसिमल स्ट्रिंग रीटर्न करेगा, और sha1() 40-करैक्टर हेक्साडेसिमल स्ट्रिंग रीटर्न करेगा। इन्हें substr() फ़ंक्शन का उपयोग करके एक ख़ास लेंथ तक ट्रिम किया जा सकता है।

इन फंक्शन्स द्वारा रीटर्न किये गए आउटपुट का एक उदाहरण यहां दिया गया है:

जैसा कि आप देख सकते हैं, 40 करैक्टर तक रैंडम और यूनिक हेक्साडेसिमल स्ट्रिंग्स को जेनेरेट करना PHP में बहुत आसान है।

क्रिप्टोग्राफिक रूप से सुरक्षित रैंडम स्ट्रिंग जेनेरेट करें

रैंडम अल्फान्यूमेरिक स्ट्रिंग्स को जेनेरेट करने के लिए तीन फंक्शन जिन्हें हमने अभी तक चर्चा की है, वे क्रिप्टोग्राफ़िक रूप से सुरक्षित नहीं हैं। सौभाग्य से, PHP में क्रिप्टोग्राफ़िक रूप से सुरक्षित सूडो-रैंडम बाइट जेनेरेट करने के लिए random_bytes($length) नामक एक फ़ंक्शन भी है। $length पैरामीटर निर्धारित करता है कि आउटपुट स्ट्रिंग कितनी लम्बी होनी चाहिए।

एक बार आपके पास रैंडम बाइट्स के मामले में आउटपुट आ जाने के बाद, आप bin2hex() फ़ंक्शन का उपयोग हेक्साडेसिमल वैल्यूज में कनवर्ट करने के लिए कर सकते हैं। यह स्ट्रिंग की लेंथ को दोगुना कर देगा।

क्रिप्टोग्राफिक रूप से सुरक्षित रैंडम बाइट जेनेरेट करने के लिए आप एक और फ़ंक्शन का उपयोग कर सकते हैं openssl_random_pseudo_bytes($length, &$crypto_strong)। दूसरे पैरामीटर की वैल्यू का प्रयोग यह निर्धारित करने के लिए किया जा सकता है कि क्रिप्टोग्राफ़िक रूप से सुरक्षित एल्गोरिदम का उपयोग करके आउटपुट स्ट्रिंग जेनेरेट की जाएगी या नहीं।

अंतिम विचार

इस ट्यूटोरियल में, हमने PHP में रैंडम नंबर्स और अल्फान्यूमेरिक स्ट्रिंग जनरेशन को देखा। रैंडम नंबर्स जेनेरेट करना विभिन्न परिस्थितियों में उपयोगी हो सकता है, जैसे गेम में जहां आपको दुश्मन के खिलाड़ियों को पैदा करना होता है या रैंडम रूप से यूज़र्स को अक्षर के बारे में कुछ सुराग देते हैं ताकि वे पूरा शब्द बना सकें।

रैंडम नंबर्स की तरह, रैंडम अल्फान्यूमेरिक स्ट्रिंग्स जनरेशन भी कई परिस्थितियों में बहुत उपयोगी हो सकती है। str_shuffle() की सहायता से, आप चुन सकते हैं कि आपके रैंडम स्ट्रिंग्स में कौन से सेट करैक्टर दिखाई देते हैं। sha1() और md5() के साथ, आप आसानी से रैंडम हेक्साडेसिमल सीक्वेंस को जेनेरेट कर सकते हैं, और random_bytes() के साथ आप क्रिप्टोग्राफ़िक रूप से सुरक्षित स्ट्रिंग जेनेरेट कर सकते हैं। यह आपको मीनिंगफुल लेकिन रैंडम फ़ाइल नाम और यूजरनाम को जेनेरेट करने की अनुमति देगा जो अनुमान लगाने में मुश्किल हो।

मुझे आशा है कि आपको यह ट्यूटोरियल अच्छा लगा होगा। यदि आपके कोई प्रश्न हैं, तो उन्हें कमैंट्स में पूछने के लिए स्वतंत्र महसूस करें।

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.