PHP यादृच्छिक स्ट्रिंग जनरेटर


814

मैं PHP में एक यादृच्छिक स्ट्रिंग बनाने की कोशिश कर रहा हूं, और मुझे इसके साथ कोई आउटपुट नहीं मिला:

<?php
    function RandomString()
    {
        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $randstring = '';
        for ($i = 0; $i < 10; $i++) {
            $randstring = $characters[rand(0, strlen($characters))];
        }
        return $randstring;
    }

    RandomString();
    echo $randstring;

मैं क्या गलत कर रहा हूं?


241
शॉर्ट स्ट्रिंग जनरेट करने के लिए मेरी एक लाइन सॉल्यूशन (md5 (रैंड)), 0, 7) है; शुभकामनाएँ ...
तस्मानीस्की

5
@tasmaniski .. आपका समाधान ठीक है .. लेकिन इसकी कम यादृच्छिकता! आपके उदाहरण में उत्पन्न होने वाले यादृच्छिक तारों की संख्या पूर्णांक के आकार तक सीमित है। (2 ^ 32) अधिकतम पर। अन्य समाधान के मामले में, आप उत्पन्न कर सकते हैं (62 ^ 8) .. मामले में, मुझे बड़े तार चाहिए, फिर अधिकतम 2 ^ 32 पर अलग-अलग तारों की संख्या बनी रहती है, लेकिन अन्य समाधान यह (62 ^ n) तक बढ़ जाता है ..
मनु

9
आप स्ट्रिंग में प्रत्येक नए जेनरेट किए गए वर्ण को जोड़ना भूल गए। आप इसे वैसे ही लिख रहे हैं जैसे यह है। $ रैंडस्ट्रिंग होना चाहिए। = $ वर्ण ..
Spock

3
@CaptainLightning क्या आप कृपया अधिक सुरक्षित लोगों में से किसी एक के लिए स्वीकृत उत्तर को स्वैप कर सकते हैं? :)
स्कॉट आर्किसेवस्की

2
strlen($characters)=> strlen($characters) - 1- स्ट्रिंग की लंबाई 1 से शुरू होती है
Zippp

जवाबों:


1393

इस सवाल का जवाब देने के लिए विशेष रूप से, दो समस्याएं:

  1. $randstring जब आप इसे प्रतिध्वनित करते हैं तो यह गुंजाइश नहीं होती है।
  2. लूप में पात्रों को एक साथ समतल नहीं किया जा रहा है।

यहाँ सुधार के साथ एक कोड स्निपेट दिया गया है:

function generateRandomString($length = 10) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}

नीचे दिए गए कॉल के साथ यादृच्छिक स्ट्रिंग का उत्पादन करें:

// Echo the random string.
// Optionally, you can give it a desired string length.
echo generateRandomString();

कृपया ध्यान दें कि यह पूर्वानुमान योग्य यादृच्छिक तार उत्पन्न करता है। यदि आप सुरक्षित टोकन बनाना चाहते हैं, तो यह उत्तर देखें


34
@FranciscoPresencia, लूप की तुलना स्थिति में एक विधि को कॉल करने के रूप में एक अतिरिक्त चर को "बर्बाद" करना बेहतर है।
रिको सोनटैग

200
वह सब काम, सिर्फ कुछ ऐसा क्यों नहीं substr(str_shuffle(MD5(microtime())), 0, 10);?
SpYk3HH

4
कोड के लिए धन्यवाद, लेकिन कृपया इसे बदल rand()दें mt_rand()। मैंने आपके तरीके का इस्तेमाल किया और नामों के साथ टकराव का एक टन का अनुभव किया ।
नैट

5
@FranciscoPresencia क्या आपके पास कोई आइडिया है कि कितना भयावह अक्षम है? आप पुनरावृत्ति प्रति दो बार एक स्ट्रिंग की लंबाई की जाँच कर रहे हैं! लूप के अंदर के स्ट्रॉनल को लूप में प्रवेश करने से पहले एक चर में कैश किया जाना चाहिए।
डेवलपर

4
यह एक अच्छा उपाय नहीं है। यह उत्पन्न होने वाले तार अनुमानित होंगे। :(
स्कॉट आर्किसेवस्की

370

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

एक और तरीका।

अद्यतन (अब यह स्ट्रिंग की कोई भी लंबाई उत्पन्न करता है):

function generateRandomString($length = 10) {
    return substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($x)) )),1,$length);
}

echo  generateRandomString();  // OR: generateRandomString(24)

बस। :)


64
सबसे छोटे उत्तर के लिए +1 :)। लेकिन हर उपयोग-मामले के लिए सबसे अच्छा जवाब नहीं। यह कोड स्ट्रिंग्स को आउटपुट करेगा जहां प्रत्येक वर्ण एक से अधिक बार दिखाई नहीं देगा (इस प्रकार यह ब्रूट बल हमलों के लिए कमजोर बनाता है) और 62 अक्षरों से अधिक समय तक कुछ भी आउटपुट नहीं करेगा।
डेविड

17
ऐसा न करें, यह बेहद कमजोर है। अब आप अपने यादृच्छिक स्ट्रिंग बनाते हैं, कमजोर यह होगा।
अभि बेकर्ट

23
कमजोर हो सकता है, लेकिन यह त्वरित और आसान है। उपयोग के मामले के आधार पर, यह ठीक है - मैंने इसका उपयोग किया है क्योंकि मुझे सुरक्षा या शक्ति की आवश्यकता नहीं थी; बस एक त्वरित आग फेरबदल। मैं एक इकाई परीक्षण लिख रहा हूं, और यह मुझे परीक्षण करने के लिए एक उपयुक्त यादृच्छिक इनपुट देता है।
SDC

23
@FranciscoPresencia कारण यह सुरक्षित नहीं है क्योंकि यह एक ही चरित्र का उपयोग दो बार नहीं करता है। यह एक भयानक पासवर्ड जनरेटर बनाता है । कृपया सभी लोग मतदान करना बंद कर दें, यह पूरी तरह असुरक्षित है इसका उपयोग कभी नहीं किया जाना चाहिए। जैसे-जैसे पासवर्ड लंबा होता जाता है, आपको एक क्रूर बल में परीक्षण करने वाले वर्णों की संख्या कम होती जाती है क्योंकि आप किसी भी पहले इस्तेमाल किए गए चरित्र का परीक्षण करने की जहमत नहीं उठाते हैं।
अभि बेकर्ट

8
@FranciscoPresencia: मैं यादृच्छिक पासवर्ड के लिए इसका उपयोग करने से बचने के बारे में आपकी टिप्पणियों का समर्थन करता हूं। हालाँकि, मैं असहमत हूँ कि यह जवाब प्लस-वन नहीं होना चाहिए। मेरे पास इस विकल्प के लिए प्लस-वन है क्योंकि यह यादृच्छिक स्ट्रिंग्स (इस प्रश्न का मूल विषय) बनाने के लिए एक प्रभावी एक-लाइन समाधान है।
बाइटाइट

331

इस प्रश्न के बहुत सारे उत्तर हैं, लेकिन उनमें से कोई भी क्रिप्टोग्राफिक रूप से सुरक्षित छद्म-यादृच्छिक संख्या जनरेटर (CSPRNG) का लाभ नहीं उठाता है ।

सरल, सुरक्षित और सही उत्तर रैंडम लाईब का उपयोग करना है और पहिए को फिर से नहीं लगाना है

आप में से जो अपने स्वयं के समाधान का आविष्कार करने पर जोर देते हैं, उनके लिए PHP 7.0.0 random_int()इस उद्देश्य के लिए प्रदान करेगा ; यदि आप अभी भी PHP 5.x पर हैं, तो हमने PHP 5 पॉलीफ़िल मेंrandom_int() लिखा है ताकि आप PHP 7 में अपग्रेड करने से पहले भी नए API का उपयोग कर सकें।

PHP में सुरक्षित रूप से यादृच्छिक पूर्णांक बनाना कोई तुच्छ कार्य नहीं है। उत्पादन में घर-निर्मित एल्गोरिदम को तैनात करने से पहले आपको हमेशा अपने निवासी StackExchange क्रिप्टोग्राफी विशेषज्ञों के साथ जांच करनी चाहिए ।

जगह में एक पूर्णांक जनरेटर के साथ, CSPRNG के साथ एक यादृच्छिक स्ट्रिंग उत्पन्न करना पार्क में टहलना है।

एक सुरक्षित, रैंडम स्ट्रिंग बनाना

/**
 * Generate a random string, using a cryptographically secure 
 * pseudorandom number generator (random_int)
 *
 * This function uses type hints now (PHP 7+ only), but it was originally
 * written for PHP 5 as well.
 * 
 * For PHP 7, random_int is a PHP core function
 * For PHP 5.x, depends on https://github.com/paragonie/random_compat
 * 
 * @param int $length      How many characters do we want?
 * @param string $keyspace A string of all possible characters
 *                         to select from
 * @return string
 */
function random_str(
    int $length = 64,
    string $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
): string {
    if ($length < 1) {
        throw new \RangeException("Length must be a positive integer");
    }
    $pieces = [];
    $max = mb_strlen($keyspace, '8bit') - 1;
    for ($i = 0; $i < $length; ++$i) {
        $pieces []= $keyspace[random_int(0, $max)];
    }
    return implode('', $pieces);
}

उपयोग :

$a = random_str(32);
$b = random_str(8, 'abcdefghijklmnopqrstuvwxyz');
$c = random_str();

डेमो : https://3v4l.org/IMJGF (PHP 5 विफलताओं पर ध्यान न दें; इसे random_compat की आवश्यकता है)


3
फ़ंक्शन की शुरुआत में $keyspace = str_shuffle($keyspace );अधिक सुरक्षा के लिए जोड़ें
जेवजेनिज पापेव

13
"अधिक सुरक्षा के लिए" से आपका क्या मतलब है? हम पहले से ही एक सुरक्षित यादृच्छिक संख्या जनरेटर का उपयोग कर रहे हैं।
स्कॉट आर्किस्जेव्स्की

5
@JGEstiot सुरक्षित रूप से यादृच्छिक स्ट्रिंग्स बनाना क्रिप्टोग्राफिक रूप से सुरक्षित यादृच्छिकता की आवश्यकता है। किसी व्यक्ति ने "कैसे PHP में यादृच्छिक स्ट्रिंग्स उत्पन्न करने के लिए खोज" एक असुरक्षित उत्तर की तुलना में एक सुरक्षित जवाब द्वारा बेहतर सेवा की है।
स्कॉट आर्किसेवस्की

1
@ स्कॉट आर्किसेवस्की आपको हर बार यादृच्छिक स्ट्रिंग्स बनाने के लिए क्रिप्टोग्राफिक रूप से यादृच्छिक स्ट्रिंग्स बनाने की आवश्यकता नहीं है। सवाल बेतरतीब तारों को बनाने का था और इसका सुरक्षा से कोई लेना-देना नहीं है। आपने मान लिया कि स्ट्रिंग का उपयोग सुरक्षा-संवेदनशील संदर्भ में किया जा रहा है और आप जटिलता की एक परत जोड़ते हैं जो प्रश्न के मूल से अलग होती है।
1939 में JG एस्टियोट

45
random_int()इसके बजाय का उपयोग करना rand()या mt_rand()डेवलपर के लिए कोई जटिलता नहीं जोड़ता है। इसी समय, यह उन्हें अधिक से अधिक सुरक्षा देता है। त्वरित समाधान की तलाश में StackOverflow के लिए आने वाले लोग यह नहीं जानते हैं कि जिस चीज का वे निर्माण कर रहे हैं वह सुरक्षित होना चाहिए या नहीं। यदि हम उन्हें सुरक्षित-डिफ़ॉल्ट उत्तर देते हैं, तो वे अपने दृष्टिकोण से भले ही अधिक सुरक्षित इंटरनेट बनाते हैं, यह पूरी तरह से आकस्मिक है। आप इस लक्ष्य का विरोध क्यों करेंगे यह मेरे लिए एक रहस्य है।
स्कॉट आर्किस्जेवस्की

155

इससे 20 वर्ण लंबी हेक्साडेसिमल स्ट्रिंग बनती है:

$string = bin2hex(openssl_random_pseudo_bytes(10)); // 20 chars

PHP 7 में ( random_bytes () ):

$string = base64_encode(random_bytes(10)); // ~14 characters, includes /=+
// or
$string = substr(str_replace(['+', '/', '='], '', base64_encode(random_bytes(32))), 0, 32); // 32 characters, without /=+
// or
$string = bin2hex(random_bytes(10)); // 20 characters, only 0-9a-f

कृपया ध्यान दें कि openssl_random_pseudo_bytes()php 5.6 तक एक क्रिप्टोग्राफिक रूप से मजबूत एल्गोरिथ्म का उपयोग नहीं किया गया था। संबंधित बग: bugs.php.net/bug.php?id=70014
acidtv 15

यह भी ध्यान दें कि यह जो सबसे छोटा तार हो सकता है, वह लंबाई 2. है। यदि आप 1 या उससे कम की बाइट पास करते हैं तो आपको openssl_random_pseudo_bytes()कुछ भी वापस नहीं मिलेगा। यह भी ध्यान दें कि जब bin2hex(openssl_random_pseudo_bytes($length / 2))आप पूर्णांक के साथ काम कर रहे हैं, तो यह स्वचालित रूप से मोड्यूलो को हटा देगा और अगले 2. के कई सबसे कम उपयोग करेगा। इसलिए, $length = 1918 की एक स्ट्रिंग का उत्पादन करेगा

प्रस्ताव फ़ाइल सामग्री है कि के माध्यम से खोला जा सकता है के रूप में उपयोग करने के लिए fgets($fp, 1024): और हर फ़ाइल संपादक है कि बहुत लंबी लाइनों के साथ समस्या है function string_rand($len, $split="\n") { return substr(chunk_split(bin2hex(openssl_random_pseudo_bytes(ceil($len / 2))), 1023, $split), 0, $len); }सेट $splitकरने के लिए nullअगर यह एक एक लाइनर लौटना चाहिए। इसके द्वारा आप इसे दोनों मामलों के लिए उपयोग कर सकते हैं।
मगुत

मैं वास्तव में PHP 7 के लिए random_bytes समाधान पसंद करता हूं, लेकिन अगर आपको एक निश्चित संख्या में वर्णों की आवश्यकता होती है, तो क्या यह काम पसंद आएगा? $string = substr(base64_encode(random_bytes($size)), 0, $size);
प्रोग्रामर

यह एक शक के बिना सबसे अच्छा समाधान है। बहुत कम जगह लेता है और समझने में आसान है।
मैथ्यू कैंपबेल

92

@tasmaniski: आपके उत्तर ने मेरे लिए काम किया। मुझे भी यही समस्या थी, और मैं इसे उन लोगों के लिए सुझाऊंगा जो कभी भी उसी उत्तर की तलाश में रहते हैं। यहाँ यह @tasmaniski से है:

<?php 
    $random = substr(md5(mt_rand()), 0, 7);
    echo $random;
?>

यहां एक यूट्यूब वीडियो दिखाया गया है जिसमें बताया गया है कि रैंडम नंबर कैसे बनाया जाता है


6
यदि आपकी स्ट्रिंग केवल एक यादृच्छिक पूर्णांक पर आधारित है, तो बस यादृच्छिक पूर्णांक का उपयोग क्यों न करें? वे हैशटैग को हैशटैग करके किसी भी गहराई तक ले जाते हैं ... और आप के हैश को काटने से वास्तव में उस छोटी एन्ट्रोपी को खत्म कर देते हैं जिसे आपको शुरू करना था।
द ड्यूरिंग

4
ध्यान रखें कि md5एक 30 वर्ण सीमा और हमेशा कम वर्ण में परिणाम होगा।
fyrye

3
इसके अलावा, क्रिप्टोग्राफी के लिए रैंड () का उपयोग नहीं किया जाना चाहिए। यदि आप क्रिप्टोग्राफिक रूप से ध्वनि स्ट्रिंग उत्पन्न करना चाहते हैं, तो Opensl_random_pseudo_bytes का उपयोग करें
मैटकाग्रॉस

md5(rand())केवल 2 ^ 32 संभावित मान प्रदान करता है। इसका मतलब है, औसतन, 2 ^ 16 रैंडम स्ट्रिंग्स के बाद आप एक को दोहराने की उम्मीद करेंगे।
स्कॉट आर्किसेवस्की

2
खैर..मैं शर्त लगाता हूं कि ओपी "सुरक्षित रूप से यादृच्छिक तारों" के बारे में बात नहीं कर रहा है। सही उपयोग के मामलों के लिए यह समाधान कॉम्पैक्ट, आसान और याद रखने योग्य है । और, यदि आपको संभावित टकरावों की देखभाल करने की आवश्यकता है, तो यादृच्छिक स्ट्रिंग के लिए टाइमस्टैम्प को प्रीपेन्ड / अपेंड करने के लिए क्यों नहीं? :)
Erenor Paz

46

आपके आवेदन के आधार पर (मैं पासवर्ड बनाना चाहता था), आप उपयोग कर सकते हैं

$string = base64_encode(openssl_random_pseudo_bytes(30));

बेस 64 होने के नाते, वे शामिल हो सकते हैं =या -साथ ही अनुरोधित वर्ण भी। आप एक लंबी स्ट्रिंग उत्पन्न कर सकते हैं, फिर उन्हें हटाने के लिए फ़िल्टर करें और ट्रिम करें।

openssl_random_pseudo_bytesphp में एक उचित यादृच्छिक संख्या उत्पन्न करने के लिए अनुशंसित तरीका लगता है। मुझे पता नहीं क्यों का randउपयोग नहीं करता /dev/randomहै।


2
रैंड का उपयोग नहीं करता है / dev / urandom क्योंकि यह केवल वातावरण की तरह posix में उपलब्ध है और पोर्टेबल नहीं है।
मैक्रोमैन

3
@MacroMan लेकिन openssl_random_pseudo_bytes() है पोर्टेबल।
जेक

यदि आप अतिरिक्त बेस 64 अक्षरों को छीनना
willbradley

3
यह गलत नहीं है, लेकिन मैं सावधानी बरतने की सलाह दूंगा कि आप अवांछित पात्रों को कैसे त्यागते हैं। उदाहरण के लिए PHP लीग के OAuth2 सर्वर पर इस पुल अनुरोध को देखें ।
स्कॉट आर्किस्विस्की

यह सबसे अच्छे उत्तरों में से एक है। अफ़सोस कि इसके पास अधिक समर्थन नहीं है। मैं अवांछित पात्रों की बेहतर हैंडलिंग के लिए आपके उत्तर को संपादित करने की सलाह दूंगा।
jcuenod

28

यहां एक सरल एक-लाइनर है जो किसी भी स्क्रिप्ट स्तर के लूपिंग या ओपनएसएसएल पुस्तकालयों के उपयोग के बिना एक सच्चे यादृच्छिक स्ट्रिंग उत्पन्न करता है।

echo substr(str_shuffle(str_repeat('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', mt_rand(1,10))), 1, 10);

इसे तोड़ने के लिए इसलिए पैरामीटर स्पष्ट हैं

// Character List to Pick from
$chrList = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

// Minimum/Maximum times to repeat character List to seed from
$chrRepeatMin = 1; // Minimum times to repeat the seed string
$chrRepeatMax = 10; // Maximum times to repeat the seed string

// Length of Random String returned
$chrRandomLength = 10;

// The ONE LINE random command with the above variables.
echo substr(str_shuffle(str_repeat($chrList, mt_rand($chrRepeatMin,$chrRepeatMax))), 1, $chrRandomLength);

यह विधि वर्ण सूची को बेतरतीब ढंग से दोहराकर काम करती है, फिर संयुक्त स्ट्रिंग को फेर देती है, और निर्दिष्ट वर्णों की संख्या लौटाती है।

आप आगे इस randomize कर सकते हैं, लौट आए स्ट्रिंग की लंबाई randomizing, की जगह $chrRandomLengthके साथ mt_rand(8, 15)(8 और 15 वर्णों के बीच एक यादृच्छिक स्ट्रिंग के लिए)।


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

@ तूफान - आप उस बयान में गलत होंगे। सभी वर्णों में इस एल्गोरिथ्म का उपयोग करने की समान संभावना है, और इस प्रकार यह वास्तव में यादृच्छिक है। यह chrList string $ chrRepeatMax को दोहराकर सुनिश्चित किया जाता है, और जादू वास्तव में str_shuffle में होता है जो यादृच्छिकता को निर्धारित करता है।
क्रांग प्राइम

सभी वर्ण केवल एक बार दिखाई देंगे और यह अनुमान लगाने के लिए बहुत अधिक प्रवण है
venimus

@venimus Thats गलत है। चार स्ट्रिंग के लिए जितने चाहें उतने वर्णों के लिए नकल की जाती है (देखें $chrRepeatMaxऔर $chrRepeatMin) - तो एक 10 चार स्ट्रिंग, कर सकते हैं (संभावना नहीं है, लेकिन संभव है), "आआआआ आआआआ"।
क्रैंग प्राइम

@SanuelJackson क्षमा करें मुझे याद आया-टिप्पणी की गई। मैंने टिप्पणी गलत उत्तर पर डाल दी है। तुम सही हो! मैंने वास्तव में आपकी "ट्रिक" का उपयोग किया था, लेकिन mt_rand का उपयोग नहीं किया, क्योंकि यह बेकार IMHO है। यह एन्ट्रापी से नहीं जुड़ता है। बस अधिकतम लंबाई के साथ कास्ट का इस्तेमाल किया।
वेनिमस

25
function generateRandomString($length = 15)
{
    return substr(sha1(rand()), 0, $length);
}

टाडा!


ध्यान रखें कि sha140 वर्ण की सीमा और परिणाम हमेशा कम वर्ण के होंगे।
fyrye

3
sha1 स्ट्रिंग्स यादृच्छिक नहीं हैं, कुछ वर्ण दूसरों की तुलना में अधिक बार घटित होंगे। यह उन मामलों में उपयोग करने के लिए नासमझ होगा जहां आप वास्तव में पासवर्ड के लिए यादृच्छिकता चाहते हैं।
किट सुंडे

1
@KitSunde - हाँ, sha रैंडम नहीं है, रैंड () यादृच्छिक है। और यहाँ क्या जरूरत है के लिए शा पूरी तरह से ठीक है। ओपी को यादृच्छिकता के क्रिप्टो स्तर की आवश्यकता नहीं है।
Davor

@ rant()यादृच्छिक होना कोई फर्क नहीं पड़ता जब शा समान रूप से वितरित नहीं होता है। यदि आप असमान वितरण से अनियमित रूप से चयन करते हैं तो आपको सटीक समान असमान वितरण मिलता है। यह "क्रिप्टो स्तर" की यादृच्छिकता नहीं है जो मैं हाइलाइट कर रहा हूं, अगर ऐसा था तो आपको उपयोग नहीं करना चाहिए rand()। यह स्वीकार किए गए उत्तर में समान वितरण से कम से कम प्रयास करने के लिए लेता है और यह रैंड () के रूप में यादृच्छिक है जो कि यथोचित है।
किट सुंडे

@ किटसंडे - इससे अंत में कोई फर्क नहीं पड़ता। यह वास्तव में अतिवृद्धि और सोना चढ़ाना की परिभाषा है।
Davor

24

इस फ़ंक्शन को लागू करने का एक बेहतर तरीका है:

function RandomString($length) {
    $keys = array_merge(range(0,9), range('a', 'z'));

    $key = "";
    for($i=0; $i < $length; $i++) {
        $key .= $keys[mt_rand(0, count($keys) - 1)];
    }
    return $key;
}

echo RandomString(20);

mt_randके अनुसार अधिक यादृच्छिक है इस और इस पीएचपी 7 में randसमारोह का एक अन्य नाम है mt_rand


1
सावधानी: mt_randक्रिप्टोग्राफिक रूप से सुरक्षित मान उत्पन्न नहीं करता है। उसके लिए आपको PHP7 random_intया का उपयोग करना चाहिए random_bytes
jchook

18

$randstringफंक्शन स्कोप में स्कोप के समान नहीं है, जहाँ आप इसे कहते हैं। आपको किसी वैरिएबल पर रिटर्न वैल्यू असाइन करना है।

$randstring = RandomString();
echo $randstring;

या सीधे वापसी मूल्य को प्रतिध्वनित करें:

echo RandomString();

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

$randstring .= $characters[rand(0, strlen($characters))];

14

सबसे पहले, आप उस वर्णमाला को परिभाषित करते हैं जिसका आप उपयोग करना चाहते हैं:

$alphanum = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$special  = '~!@#$%^&*(){}[],./?';
$alphabet = $alphanum . $special;

फिर, openssl_random_pseudo_bytes()उचित यादृच्छिक डेटा उत्पन्न करने के लिए उपयोग करें:

$len = 12; // length of password
$random = openssl_random_pseudo_bytes($len);

अंत में, आप पासवर्ड बनाने के लिए इस यादृच्छिक डेटा का उपयोग करते हैं। चूँकि प्रत्येक वर्ण तब तक $randomहो सकता है , chr(0)जब तक कि वर्णमाला के केवल वर्णों को चुन लिया जाता है (ध्यान दें कि ऐसा बेतरतीब ढंग से किया जा रहा है):chr(255)$alphabet_length

$alphabet_length = strlen($alphabet);
$password = '';
for ($i = 0; $i < $len; ++$i) {
    $password .= $alphabet[ord($random[$i]) % $alphabet_length];
}

वैकल्पिक रूप से, और आम तौर पर बेहतर, रैंडमलीब और सिक्योरिटीलिब का उपयोग करना है :

use SecurityLib\Strength;

$factory = new RandomLib\Factory;
$generator = $factory->getGenerator(new Strength(Strength::MEDIUM));

$password = $generator->generateString(12, $alphabet);

मॉडुलो ऑपरेटर के उपयोग से %पक्षपातपूर्ण उत्पादन होगा। हालाँकि, randomLib के लिए मजबूत +1। पहिया को सुदृढ़ मत करो।
स्कॉट आर्किसेवस्की

1
हाँ, नया random_int () फ़ंक्शन अच्छा है: D
Ja Junck

11

लघु विधियाँ ।।

यादृच्छिक स्ट्रिंग उत्पन्न करने के लिए यहां कुछ सबसे छोटी विधि दी गई है

<?php
echo $my_rand_strng = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), -15); 

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

echo str_shuffle(MD5(microtime()));
?>

10

मैंने वहां सबसे लोकप्रिय कार्यों के प्रदर्शन का परीक्षण किया है, जो मेरे बॉक्स पर 32 प्रतीकों के 1'000'000 तार उत्पन्न करने के लिए आवश्यक समय है:

2.5 $s = substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($x)) )),1,32);
1.9 $s = base64_encode(openssl_random_pseudo_bytes(24));
1.68 $s = bin2hex(openssl_random_pseudo_bytes(16));
0.63 $s = base64_encode(random_bytes(24));
0.62 $s = bin2hex(random_bytes(16));
0.37 $s = substr(md5(rand()), 0, 32);
0.37 $s = substr(md5(mt_rand()), 0, 32);

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

एमडी 5 के आसपास पदार्थ () सटीकता की खातिर जोड़ा गया था यदि आपको स्ट्रिंग की आवश्यकता है जो 32 प्रतीकों से कम है।

उत्तर की खातिर: स्ट्रिंग को संक्षिप्त नहीं किया गया था, लेकिन अधिलेखित और फ़ंक्शन का परिणाम संग्रहीत नहीं किया गया था।


मुझे लगता है, कि सबसे अच्छा जवाब। धन्यवाद!
NSukonny

10

PHP 7+ random_bytes फ़ंक्शन का उपयोग करके क्रिप्टोग्राफ़िक रूप से सुरक्षित बाइट्स उत्पन्न करें ।

$bytes = random_bytes(16);
echo bin2hex($bytes);

संभव उत्पादन

da821217e61e33ed4b2dd96f8439056c


PHP 5.3+ खुलता है, जिसमें psudo -random बाइट्स का उपयोग करता है।

$bytes = openssl_random_pseudo_bytes(16);
echo bin2hex($bytes);

संभव उत्पादन

e2d1254506fbb6cd842cd640333214ad


सबसे अच्छा उपयोग मामला हो सकता है

function getRandomBytes($length = 16)
{
    if (function_exists('random_bytes')) {
        $bytes = random_bytes($length / 2);
    } else {
        $bytes = openssl_random_pseudo_bytes($length / 2);
    }
    return bin2hex($bytes);
}
echo getRandomBytes();

संभव उत्पादन

ba8cc342bdf91143


यह दी गई लंबाई के साथ एक स्ट्रिंग उत्पन्न नहीं करेगा
टिम्बरमैन

@ टिम्बरमैन यह अब सटीक लंबाई उत्पन्न करेगा।
मदन सपकोटा

9

एक बहुत ही त्वरित तरीका कुछ करना है:

substr(md5(rand()),0,10);

यह 10 वर्णों की लंबाई के साथ एक यादृच्छिक स्ट्रिंग उत्पन्न करेगा। बेशक, कुछ कह सकते हैं कि यह संगणना पक्ष पर थोड़ा अधिक भारी है, लेकिन आजकल प्रोसेसर md5 या sha256 एल्गोरिथ्म को बहुत तेज़ी से चलाने के लिए अनुकूलित हैं। और निश्चित रूप से, यदि rand()फ़ंक्शन समान मान लौटाता है, तो परिणाम समान होगा, जिसके समान होने का 1/32767 मौका होगा। सुरक्षा समस्या है, तो बस बदलने rand()के लिएmt_rand()


7
function rndStr($len = 64) {
     $randomData = file_get_contents('/dev/urandom', false, null, 0, $len) . uniqid(mt_rand(), true);
     $str = substr(str_replace(array('/','=','+'),'', base64_encode($randomData)),0,$len);
    return $str;
}

4
यह पोर्टेबल नहीं है; यदि आप इसे किसी भी गैर-पॉज़िक्स वातावरण में चलाने का प्रयास करते हैं, तो यह एक घातक त्रुटि का कारण होगा।
ब्रायन आयु


6

लारवेल 5 फ्रेमवर्क से हेल्पर फ़ंक्शन

/**
 * Generate a "random" alpha-numeric string.
 *
 * Should not be considered sufficient for cryptography, etc.
 *
 * @param  int  $length
 * @return string
 */
function str_random($length = 16)
{
    $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

    return substr(str_shuffle(str_repeat($pool, $length)), 0, $length);
}

4
"क्रिप्टोग्राफी, आदि के लिए पर्याप्त नहीं माना जाना चाहिए" इस पर जोर दिया जाना चाहिए।
3


4

फ़ंक्शन का संपादित संस्करण ठीक काम करता है, लेकिन सिर्फ एक समस्या है जो मैंने पाया: आपने $ वर्णों को संलग्न करने के लिए गलत वर्ण का उपयोग किया था, इसलिए 'वर्ण कभी-कभी उत्पन्न होने वाले यादृच्छिक स्ट्रिंग का हिस्सा होता है।

इसे ठीक करने के लिए, बदलें:

$characters = 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’;

सेवा:

$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

इस तरह केवल संलग्न वर्णों का उपयोग किया जाता है, और 'वर्ण कभी भी उत्पन्न होने वाले यादृच्छिक स्ट्रिंग का हिस्सा नहीं होगा।


4

एक और एक-लाइनर, जो अक्षरों और संख्याओं के साथ 10 वर्णों का एक यादृच्छिक स्ट्रिंग उत्पन्न करता है। यह एक सरणी बनाएगा range(आकार को सेट करने के लिए दूसरा पैरामीटर समायोजित करें), इस सरणी पर लूप करता है और एक यादृच्छिक ASCII वर्ण (रेंज 0-9 या az) असाइन करता है, फिर एक स्ट्रिंग प्राप्त करने के लिए सरणी को निहित करता है।

$str = implode('', array_map(function () { return chr(rand(0, 1) ? rand(48, 57) : rand(97, 122)); }, range(0, 9)));

नोट: यह केवल PHP 5.3 और बाद में काम करता है


अंत में वास्तव में एक यादृच्छिक समाधान नहीं है एक 32 बिट यादृच्छिक पूर्णांक या फेरबदल स्ट्रिंग के कुछ फूला हुआ हैश ...
15

theres सिर्फ एक मुद्दा: संख्याएँ वर्णों के रूप में होने की संभावना है, जो कि यादृच्छिक नहीं है जितना कि मुझे यह पसंद आएगा। इस पृष्ठ पर सबसे अच्छा समाधान के लिए anyaway +1। कि और इसके एकदम सही।
१:१४ बजे

ट्वीक ... ऐसे? rand(0, 57-48+122-97)<57-48?...:...? :)
vp_arth

4

एक लाइन।

यह कुछ विशिष्टता के साथ विशाल तार के लिए तेज़ है।

function random_string($length){
    return substr(str_repeat(md5(rand()), ceil($length/32)), 0, $length);
}

md5(rand())एक यादृच्छिक संख्या उत्पन्न करने के लिए एक भयावह असुरक्षित तरीका है।
स्कॉट आर्किसेवस्की

1
एक्स लंबाई और कुछ विशिष्टता के साथ एक स्ट्रिंग का इरादा है। सच यादृच्छिकता का इरादा नहीं है।
जैकब स्मिथ


3

मुझे पिछली टिप्पणी पसंद आई, जो ओपनस्लैट_रंगमेड_पेसड्यू_बाइट्स का उपयोग करती है, लेकिन यह मेरे लिए कोई समाधान नहीं था क्योंकि मुझे अभी भी उन पात्रों को हटाना था जो मैं नहीं चाहता था, और मैं एक सेट लंबाई स्ट्रिंग प्राप्त करने में सक्षम नहीं था। यहाँ मेरा समाधान है ...

function rndStr($len = 20) {
    $rnd='';
    for($i=0;$i<$len;$i++) {
        do {
            $byte = openssl_random_pseudo_bytes(1);
            $asc = chr(base_convert(substr(bin2hex($byte),0,2),16,10));
        } while(!ctype_alnum($asc));
        $rnd .= $asc;
    }
    return $rnd;
}


3

यहाँ मेरा सरल एक लाइन सॉल्यूशन है जो यूज़ फ्रेंडली रैंडम पासवर्ड जनरेट करने के लिए, "1" और "l", "O" और "0", इत्यादि जैसे वर्णों को छोड़कर ... यहाँ 5 वर्ण हैं लेकिन आप आसानी से देख सकते हैं इसे बदलो:

$user_password = substr(str_shuffle('abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ23456789'),0,5);

यह बाद में jquery पर कॉल करने के लिए यादृच्छिक आईडी स्ट्रिंग्स बनाने के लिए एकदम सही है। IDK अगर इसकी अच्छी प्रैक्टिस है, लेकिन इसने मुझे बहुत मदद की, बिना किसी स्वीकृत उत्तर के उपयोग के लिए ...
रॉड्रिगो ज़ुलुगा

3

यहाँ एक और उपाय है।

function genRandomString($length = 10)
{
    if($length < 1)
        $length = 1;
    return substr(preg_replace("/[^A-Za-z0-9]/", '', base64_encode(openssl_random_pseudo_bytes($length * 2))), 0, $length);
}

पुनश्च। मैं Ubuntu 7.2 का उपयोग कर रहा हूं उबंटू पर।


2

PHP में एक यादृच्छिक स्ट्रिंग उत्पन्न करने का दूसरा तरीका है:

function RandomString($length) {
    $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 RandomString(6);

2

यहाँ है कि मैं यह कैसे कर रहा हूँ एक असली अद्वितीय यादृच्छिक कुंजी पाने के लिए:

$Length = 10;
$RandomString = substr(str_shuffle(md5(time())), 0, $Length);
echo $RandomString;

आप समय () का उपयोग कर सकते हैं क्योंकि यह एक यूनिक्स टाइमस्टैम्प है और ऊपर उल्लिखित अन्य यादृच्छिक की तुलना में हमेशा अद्वितीय है। फिर आप उस की md5sum उत्पन्न कर सकते हैं और वांछित लंबाई ले सकते हैं जो आपको उत्पन्न एमडी 5 से चाहिए स्ट्रिंग से चाहिए। इस मामले में मैं 10 अक्षरों का उपयोग कर रहा हूं, और अगर मैं इसे और अधिक अनूठा बनाना चाहता हूं तो मैं एक लंबे स्ट्रिंग का उपयोग कर सकता हूं।

आशा है कि ये आपकी मदद करेगा।


2
बेशक, time()अद्वितीय से बहुत दूर है: यह वर्तमान दूसरी छोरों तक बार-बार एक ही मूल्य लौटाएगा। क्या वास्तव में यहाँ कुछ यादृच्छिकता प्रदान करता है str_shuffle()- बाकी कोड केवल नमूने को चार्ट से चुनने के लिए कम करता है।
अल्वारो गोंजालेज

1
तो आप मूल रूप से जो कर रहे हैं वह 32 बिट पूर्णांक के आसपास है। यहाँ बहुत सारी एन्ट्रापी नहीं है ...
द ड्यूरिंग

2
एक हमलावर मूल्य का अनुमान लगा सकता है time()(यह केवल एक टाइमस्टैम्प है), यह यादृच्छिकता का एक कमजोर स्रोत है।
AL

2

PHP 5.1.0 के बाद से काम कर रहे केवल PHP मूल कार्यों का उपयोग करते हुए एक-लाइनर

str_shuffle(implode('', (array_intersect_key(($map =  array_map('chr', array_merge(array_map('mt_rand', array_fill(0, $length = 25, 48), array_fill(0,$length,57)),array_map('mt_rand', array_fill(0, $length, 65), array_fill(0,$length,90)),array_map('mt_rand', array_fill(0, $length, 97), array_fill(0,$length,122))))), array_flip($keys = array_rand($map, $length))))))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.