दिलचस्प पोस्ट
ऑडिट तालिका में एसक्यूएल सर्वर में रिकॉर्ड परिवर्तन दर्ज करें टिल्ड विस्तार बश में काम नहीं कर रहा है क्यों नहीं getchar () मेरे लिए scanf () के बाद दर्ज करने के लिए इंतजार? जावास्क्रिप्ट सेटइनर्वर और `यह` समाधान जावा: जेपीनेल पृष्ठभूमि स्केलिंग नहीं है पायथन में दो सूचियों को दोहराते हुए टाइम आश्रित इकाई परीक्षण एचटीएमएल 5 कैनवास का इस्तेमाल करते हुए छवि हेरफेर और बनावट मानचित्रण? एक छवि का फ़ाइल प्रकार निर्धारित करें मैं JSON डेटा पोस्ट करने के लिए JQuery का उपयोग कैसे कर सकता हूं? Android DatePicker केवल महीना और वर्ष में परिवर्तन पावरशेल आईई 9 कॉम ऑब्जेक्ट में वेबपेज पर नेविगेट करने के बाद सभी रिक्त गुण हैं क्या मैं अनुरोध पर बाहरी स्टाइलशीट लोड कर सकता हूं? अहस्ताक्षरित पूर्णांक ओवरफ़्लो परिभाषित व्यवहार क्यों नहीं है, पर हस्ताक्षर किए पूर्णांक अतिप्रवाह है? सामग्री में कैरेट (कर्सर) स्थिति प्राप्त करें HTML सामग्री युक्त संपादन योग्य क्षेत्र

कैसे PHP का उपयोग कर एक यादृच्छिक स्ट्रिंग बनाने के लिए?

मुझे पता है कि PHP में रैंड फ़ंक्शन यादृच्छिक पूर्णांक बनाता है, लेकिन एक यादृच्छिक स्ट्रिंग उत्पन्न करने का सबसे अच्छा तरीका क्या है जैसे कि:

मूल स्ट्रिंग, 9 वर्ण

$string = 'abcdefghi'; 

6 अक्षरों तक सीमित यादृच्छिक स्ट्रिंग उदाहरण

 $string = 'ibfeca'; 

अद्यतनः मैंने इन प्रकार के कार्यों को पाया है, मूलतः मैं प्रत्येक चरण के पीछे तर्क को समझने की कोशिश कर रहा हूं।

अद्यतनः फ़ंक्शन किसी भी राशि की आवश्यकता के अनुसार वर्णों को उत्पन्न करना चाहिए।

यदि आप उत्तर देते हैं तो कृपया भागों पर टिप्पणी करें।

वेब के समाधान से एकत्रित समाधान "कैसे PHP का उपयोग कर एक यादृच्छिक स्ट्रिंग बनाने के लिए?"

खैर, आपने मेरी टिप्पणी में उन सभी सवालों को स्पष्ट नहीं किया है, लेकिन मुझे लगता है कि आप ऐसा फ़ंक्शन चाहते हैं, जो "संभावित" वर्णों की स्ट्रिंग और वापसी की स्ट्रिंग की लंबाई ले सकता है। अनुरोधित रूप से अच्छी तरह टिप्पणी की गई, अधिक सामान्यताओं के सामान्य रूप से अधिक चर का उपयोग करके, स्पष्टता के लिए:

 function get_random_string($valid_chars, $length) { // start with an empty random string $random_string = ""; // count the number of chars in the valid chars string so we know how many choices we have $num_valid_chars = strlen($valid_chars); // repeat the steps until we've created a string of the right length for ($i = 0; $i < $length; $i++) { // pick a random number from 1 up to the number of valid chars $random_pick = mt_rand(1, $num_valid_chars); // take the random character out of the string of valid chars // subtract 1 from $random_pick because strings are indexed starting at 0, and we started picking at 1 $random_char = $valid_chars[$random_pick-1]; // add the randomly-chosen char onto the end of our string so far $random_string .= $random_char; } // return our finished random string return $random_string; } 

इस फ़ंक्शन को अपने उदाहरण डेटा के साथ कॉल करने के लिए, आप इसे कुछ ऐसा कहते हैं:

 $original_string = 'abcdefghi'; $random_string = get_random_string($original_string, 6); 

ध्यान दें कि यह फ़ंक्शन इस पर पारित वैध वर्णों में विशिष्टता की जांच नहीं करता है। उदाहरण के लिए, अगर आपने इसे 'AAAB' वैध वर्ण स्ट्रिंग के साथ बुलाया है, तो बी के रूप में प्रत्येक अक्षर के लिए ए को चुनने की तीन गुना अधिक संभावना होगी। यह आपकी आवश्यकताओं के आधार पर बग या एक फीचर माना जा सकता है।

यदि आप अक्षरों के दोहरावपूर्ण घटनाओं को अनुमति देना चाहते हैं, तो आप इस फ़ंक्शन का उपयोग कर सकते हैं:

 function randString($length, $charset='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') { $str = ''; $count = strlen($charset); while ($length--) { $str .= $charset[mt_rand(0, $count-1)]; } return $str; } 

मूल एल्गोरिथ्म < लंबाई > बार 0 और < अक्षर की संख्या > – 1 के बीच एक यादृच्छिक संख्या उत्पन्न करने के लिए है – 1 हम सूचकांक के रूप में हमारे सेट से एक चरित्र को चुनने के लिए उपयोग करते हैं और उन वर्णों को जोड़ते हैं। 0 और < अक्षर की संख्या > – 1 सीमा $charset स्ट्रिंग की सीमा का प्रतिनिधित्व करती है, क्योंकि पहले वर्ण को $charset[0] और अंतिम $charset[count($charset) - 1] से संबोधित किया जाता है।

मेरा मनपसंद:

  echo substr(md5(rand()), 0, 7); 

तो, मुझे एक लाइब्रेरी का इस्तेमाल करते हुए शुरू करना चाहिए कई मौजूद हैं:

  • RandomCompat
  • RandomLib
  • SecurityMultiTool

इस समस्या का मुख्य भाग इस पृष्ठ पर लगभग हर उत्तर हमले के लिए अतिसंवेदनशील है। mt_rand() , rand() , lcg_value() और uniqid() सभी हमला करने के लिए कमजोर हैं।

एक अच्छी प्रणाली फाइल सिस्टम से /dev/urandom उपयोग करेगी, या mcrypt_create_iv() ( MCRYPT_DEV_URANDOM साथ) या openssl_pseudo_random_bytes() । जो उपरोक्त सभी करते हैं PHP 7 दो नए कार्यों random_bytes($len) और random_int($min, $max) जो भी सुरक्षित हैं के साथ आ जाएगा।

ध्यान रखें कि उन कार्यों में से अधिकांश ( random_int() को छोड़कर "कच्चे स्ट्रिंग्स" का अर्थ है कि वे 0 - 255 से किसी भी एएससीआईआई वर्ण को शामिल कर सकते हैं। अगर आप एक प्रिंट करने योग्य स्ट्रिंग चाहते हैं, तो मैं base64_encode() माध्यम से परिणाम चलाने का सुझाव देता हूं।

 function generate_random_string($name_length = 8) { $alpha_numeric = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; return substr(str_shuffle(str_repeat($alpha_numeric, $name_length)), 0, $name_length); } 

नीचे दिए गए सुझावों में mzhang के महान सुझाव के अनुसार कोड अपडेट किया गया।

@ टासासमिस के उत्कृष्ट उत्तर का एक बेहतर और अद्यतन संस्करण:

rand() बजाय mt_rand() का उपयोग करते हुए बेहतर संस्करण:

 echo md5(mt_rand()); // 32 char string = 128bit 

इससे भी बेहतर, अब स्ट्रिंग्स के लिए hash() फ़ंक्शन का उपयोग करके जो हैशिंग एल्गोरिथम का चयन करने की अनुमति देता है:

 echo hash('sha256', mt_rand()); // 64 char string echo hash('sha512', mt_rand()); // 128 char string 

यदि आप परिणाम को कम करने के लिए नीचे 50 वर्णों का कहना चाहते हैं, तो ऐसा करें:

 echo substr(hash('sha256', mt_rand()), 0, 50); // 50 char string 

अंत में अक्षरों में शामिल होना अधिक कुशल होना चाहिए, जो दोहराया स्ट्रिंग संयोजन।

# 1 संपादित करें: वर्ण पुनरावृत्ति से बचने के लिए जोड़ा विकल्प।

# 2 संपादित करें: असीमित लूप में आने से बचने के लिए अपवाद फेंकता है अगर $ नोरपेत का चयन किया जाता है और $ len से चुनने के लिए वर्णसेट से अधिक है

# 3 संपादित करें: जब $ नॉरपेत चुना जाता है, तो यादृच्छिक वर्णों को संग्रहित करने के लिए सरणी कुंजियों का उपयोग करता है, क्योंकि साहचर्य सरणी कुंजी लुकअप सरणी खोज करने से अधिक तेजी से होता है।

 function rand_str($len, $norepeat = true) { $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; $max = strlen($chars) - 1; if ($norepeat && len > $max + 1) { throw new Exception("Non repetitive random string can't be longer than charset"); } $rand_chars = array(); while ($len) { $picked = $chars[mt_rand(0, $max)]; if ($norepeat) { if (!array_key_exists($picked, $rand_chars)) { $rand_chars[$picked] = true; $len--; } } else { $rand_chars[] = $picked; $len--; } } return implode('', $norepeat ? array_keys($rand_chars) : $rand_chars); } 

यह यादृच्छिक स्ट्रिंग पैदा करेगा

 function generateRandomString($length=10) { $original_string = array_merge(range(0,9), range('a','z'), range('A', 'Z')); $original_string = implode("", $original_string); return substr(str_shuffle($original_string), 0, $length); } echo generateRandomString(6); 

मुझे लगता है कि मैं यहाँ भी अपना योगदान जोड़ूंगा।

 function random_string($length) { $bytes_1 = openssl_random_pseudo_bytes($length); $hex_1 = bin2hex($bytes_1); $random_numbers = substr(sha1(rand()), 0, $length); $bytes_2 = openssl_random_pseudo_bytes($length); $hex_2 = bin2hex($bytes_2); $combined_chars = $hex_1 . $random_numbers . $hex_2; $chars_crypted = hash('sha512', $combined_chars); return $chars_crypted; } 

धन्यवाद

इस के अधिकांश पहलुओं पर पहले से ही चर्चा हुई है, लेकिन मैं एक मामूली अद्यतन की सिफारिश करता हूं: यदि आप इसे खुदरा उपयोग के लिए उपयोग कर रहे हैं, तो मैं डोमेन ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 से बचना चाहूंगा

और इसके बजाय उपयोग करें: एबीसीडीईएफजीएचएमएमएमपीपीआरएसटीयूवीएक्सएक्सएएसएएसएएसईएएसएएमएसएक्स

दी, आप बहुत कम वर्णों के साथ समाप्त होते हैं, लेकिन यह बहुत परेशानी बचाता है, क्योंकि ग्राहक ओ के लिए 0 या एल के लिए 2 या 2 के लिए गलती नहीं कर सकते। इसके अलावा, आप इनपुट पर एक ऊपियर कर सकते हैं और तब ग्राहक कर सकते हैं ऊपरी या लोअर केस अक्षरों को दर्ज करें – जो कभी-कभी भ्रामक होते हैं क्योंकि वे समान दिख सकते हैं।

आप के लिए एक यादृच्छिक स्ट्रिंग की क्या आवश्यकता है?

क्या यह किसी पासवर्ड से दूरस्थ रूप से कुछ के लिए इस्तेमाल किया जा रहा है?

यदि आपकी यादृच्छिक स्ट्रिंग को सभी सुरक्षा गुणों की आवश्यकता होती है, तो आपको इस धागे में सभी असुरक्षित mt_rand() उत्तरों के बजाय PHP 7 के random_int() फ़ंक्शन का उपयोग करना चाहिए।

 /** * Generate a random string * * @link https://paragonie.com/b/JvICXzh_jhLyt4y3 * * @param int $length - How long should our random string be? * @param string $charset - A string of all possible characters to choose from * @return string */ function random_str($length = 32, $charset = 'abcdefghijklmnopqrstuvwxyz') { // Type checks: if (!is_numeric($length)) { throw new InvalidArgumentException( 'random_str - Argument 1 - expected an integer' ); } if (!is_string($charset)) { throw new InvalidArgumentException( 'random_str - Argument 2 - expected a string' ); } if ($length < 1) { // Just return an empty string. Any value < 1 is meaningless. return ''; } // This is the maximum index for all of the characters in the string $charset $charset_max = strlen($charset) - 1; if ($charset_max < 1) { // Avoid letting users do: random_str($int, 'a'); -> 'aaaaa...' throw new LogicException( 'random_str - Argument 2 - expected a string at least 2 characters long' ); } // Now that we have good data, this is the meat of our function: $random_str = ''; for ($i = 0; $i < $length; ++$i) { $r = random_int(0, $charset_max); $random_str .= $charset[$r]; } return $random_str; } 

यदि आप अभी तक PHP 7 पर नहीं हैं (जो संभवतः मामला है, क्योंकि यह इस लेखन के रूप में जारी नहीं किया गया है), तो आप पैरागोनि / यादृच्छिक_कम्पट चाहते हैं, जो कि random_bytes() और random_int() का एक random_bytes() कार्यान्वयन है random_int() PHP 5 परियोजनाओं के लिए

सुरक्षा संदर्भों के लिए, हमेशा random_int() उपयोग करें, rand() , mt_rand() , आदि । के रूप में अच्छी तरह से ircmaxell का जवाब देखें।

 // @author http://codeascraft.etsy.com/2012/07/19/better-random-numbers-in-php-using-devurandom/ function devurandom_rand($min = 0, $max = 0x7FFFFFFF) { $diff = $max - $min; if ($diff < 0 || $diff > 0x7FFFFFFF) { throw new RuntimeException('Bad range'); } $bytes = mcrypt_create_iv(4, MCRYPT_DEV_URANDOM); if ($bytes === false || strlen($bytes) != 4) { throw new RuntimeException('Unable to get 4 bytes'); } $ary = unpack('Nint', $bytes); $val = $ary['int'] & 0x7FFFFFFF; // 32-bit safe $fp = (float) $val / 2147483647.0; // convert to [0,1] return round($fp * $diff) + $min; } function build_token($length = 60, $characters_map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') { $map_length = mb_strlen($characters_map)-1; $token = ''; while ($length--) { $token .= mb_substr($characters_map, devurandom_rand(0,$map_length),1); } return $token; } 

यह केवल UNIX वातावरण में काम करेगा जहां PHP को mcrypt साथ संकलित किया गया है।

क्या आप मूल पासवर्ड के यादृच्छिक क्रमचय द्वारा अपना पासवर्ड बनाना चाहते हैं? क्या इसमें केवल अनूठे पात्रों को शामिल करना चाहिए?

सूचकांक द्वारा यादृच्छिक अक्षरों को चुनने के लिए rand का उपयोग करें।

आप सरणी से एक अक्षर चुनने के लिए रैंड का उपयोग करते हैं और स्ट्रिंग को जोड़ सकते हैं।

 $letters = array( [0] => 'a' [1] => 'b' [2] => 'c' [3] => 'd' ... [25] = 'z'); $lengthOfString = 10; $str = ''; while( $lengthOfString-- ) { $str .= $letters[rand(0,25)]; } echo $str; 

* ध्यान दें कि यह दोहराने वाले वर्णों की अनुमति देता है

यह आधार वर्ण सेट में छोड़े जाने वाले वर्णों के एक सेट की सूची के लिए कार्यक्षमता जोड़कर गुम्बो के समाधान पर बनाता है। यादृच्छिक स्ट्रिंग $base_charset से वर्ण का चयन करता है जो $skip_charset में भी दिखाई नहीं $skip_charset

 /* Make a random string of length using characters from $charset, excluding $skip_chars. * @param length (integer) length of return value * @param skip_chars (string) characters to be excluded from $charset * @param charset (string) characters of posibilities for characters in return val * @return (string) random string of length $length */ function rand_string( $length, $skip_charset = '', $base_charset='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'){ $skip_len = strlen($skip_charset); for ($i = 0; $i<$skip_len; $i++){ $base_charset = str_replace($skip_charset[$i], '', $base_charset); } cvar_dump($base_charset, '$base_charset after replace'); $str = ''; $count = strlen($base_charset); while ($length--) { $str .= $base_charset[mt_rand(0, $count - 1)]; } return $str; } 

यहां कुछ उपयोग उदाहरण दिए गए हैं। पहले दो उदाहरण $base_charset लिए डिफ़ॉल्ट मान का उपयोग करते हैं पिछले उदाहरण स्पष्ट रूप से $base_charset परिभाषित करता है

 echo rand_string(15, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'); // 470620078953298 echo rand_string(8, 'abcdefghijklmnopqrstuvwxyz0123456789'); // UKLIHOTFSUZMFPU echo rand_string(15, 'def', 'abcdef'); // cbcbbccbabccaba 

ठीक है, मैं एक समाधान की तलाश कर रहा था, और मैं चीदा @ चाड बिर्च का समाधान @ गुंबो के एक के साथ विलय कर दिया। मैंने ये ढूंढ निकाला:

 function get_random_string($length, $valid_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456790!·$%&/()=?¿¡',.-;:+*`+´ç") { $random_string = ""; $num_valid_chars = strlen($valid_chars); for ($i = 0; $i < $length; $i++, $random_string .= $valid_chars[mt_rand(1, $num_valid_chars)-1]); return $random_string; } 

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

यदि आप समय, मेमोरी, या सीपीयू दक्षता के बारे में चिंतित नहीं हैं, और यदि आपका सिस्टम इसे संभाल सकता है, तो यह एल्गोरिदम का प्रयास क्यों न करें?

 function randStr($len, $charset = 'abcdABCD0123') { $out = ''; $str = array(); for ($i = 0; $i < PHP_INT_MAX; $i++) { $str[$i] = $charset; shuffle($str); $charset .= implode($charset, $str); $charset = str_shuffle($charset); } $str = array_flip($str); $str = array_keys($str); for ($i = 0; $i < PHP_INT_MAX; $i++) { shuffle($str); } $str = implode('', $str); for ($i = 0; $i < strlen($str); $i++) { $index = mt_rand(1, strlen($str)); $out .= $str[$index - 1]; } for ($i = 0; $i < PHP_INT_MAX; $i++) { $out = str_shuffle($out); } return substr($out, 0, $len); } 

शायद यह बेहतर पढ़ा अगर यह पुनरावर्ती का उपयोग करता है, लेकिन मुझे यकीन नहीं है कि क्या PHP पीठ का इस्तेमाल करता है या नहीं …