उत्पन्न (छद्म) यादृच्छिक अल्फा-न्यूमेरिक स्ट्रिंग्स


85

मैं एक (छद्म) यादृच्छिक अल्फा-न्यूमेरिक स्ट्रिंग कैसे उत्पन्न कर सकता हूं, कुछ इस तरह: PHP में 'd79jd8c'?


समाधान छोटा और अनूठा है। इस लिंक को देखें stackoverflow.com/a/34467730/4345141
Saud Khan

विधि Random::alphanumericString($length)वही करती है जो आप चाहते हैं। यदि आप इसे स्वयं बनाना चाहते हैं, तो PHP के अंतर्निहित random_bytesया के अलावा किसी भी यादृच्छिक स्रोत का उपयोग न करें random_int
caw

जवाबों:


164

पहले अपने सभी संभावित पात्रों के साथ एक स्ट्रिंग बनाएं:

 $characters = 'abcdefghijklmnopqrstuvwxyz0123456789';

आप इसे अधिक तेज़ी से करने के लिए रेंज () का उपयोग भी कर सकते हैं ।

फिर, एक लूप में, एक यादृच्छिक संख्या चुनें और $charactersएक यादृच्छिक वर्ण प्राप्त करने के लिए इसे इंडेक्स के रूप में स्ट्रिंग में उपयोग करें , और इसे अपने स्ट्रिंग में जोड़ें:

 $string = '';
 $max = strlen($characters) - 1;
 for ($i = 0; $i < $random_string_length; $i++) {
      $string .= $characters[mt_rand(0, $max)];
 }

$random_string_length यादृच्छिक स्ट्रिंग की लंबाई है।


9
यह कार्यान्वयन भी अच्छा है यदि आप ऐसे वर्णों को हटाना चाहते हैं जो "l" और "1", "O" और "0" जैसे समान दिखते हैं। उपयोगकर्ताओं के लिए नए पासवर्ड बनाते समय यह सार्थक है।
मार्क नोल्ड

10
मैं भी इस तकनीक का उपयोग करता हूं और सभी स्वरों को हटा देता हूं ताकि मैं गलती से किसी को पासवर्ड के लिए कुछ अशिष्ट न दे।
nickf

10
मामूली सुधार: के mt_rand()लिए एक ड्रॉप-इन प्रतिस्थापन है rand(), और बेहतर है।
Grilse

11
strlen()प्रत्येक पुनरावृत्ति को निष्पादित करना अच्छा नहीं है। strlen($characters) - 1एक चर को असाइन करें और चक्र से बाहर strlen प्रदर्शन करें। इस मामले में महत्वपूर्ण नहीं है, लेकिन यह सिर्फ Mauvais टन है
मिन्टोबिट

6
यदि आपको क्रिप्टोग्राफिक रूप से सुरक्षित यादृच्छिक की आवश्यकता है, तो random_int का उपयोग करने पर विचार करें ।
वास्तव में

18

मुझे नौकरी के लिए यह फ़ंक्शन पसंद है

function randomKey($length) {
    $pool = array_merge(range(0,9), range('a', 'z'),range('A', 'Z'));

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

echo randomKey(20);

14

क्रिप्टोग्राफिक रूप से मजबूत, यादृच्छिक (संभावित) उत्पन्न करता है 8-वर्ण स्ट्रिंग जो कि हंसली का उपयोग करता है_random_pseudo_tetes :

echo bin2hex(openssl_random_pseudo_bytes(4));

प्रक्रियात्मक तरीका:

function randomString(int $length): string
{
    return bin2hex(openssl_random_pseudo_bytes($length));
}

अपडेट करें:

PHP7 ने उन random_x()कार्यों को पेश किया जो बेहतर होना चाहिए। यदि आप PHP 5.X से आते हैं, तो उत्कृष्ट paragonie / random_compat लाइब्रेरी का उपयोग करें जो PHP 7 से random_bytes () और random_int () के लिए एक पॉलीफ़िल है

function randomString($length)
{
    return bin2hex(random_bytes($length));
}

7

एक पंक्ति समाधान:

echo substr( str_shuffle( str_repeat( 'abcdefghijklmnopqrstuvwxyz0123456789', 10 ) ), 0, 7 );

आप अपनी स्ट्रिंग के लिए एक अलग लंबाई निर्धारित करने के लिए रूट पैरामीटर बदल सकते हैं।


4

अक्षरों की एक श्रृंखला लेने के लिए ASCII तालिका का उपयोग करें , जहां: $ रेंज_स्टार्ट, $ रेंज_एंड ASCII तालिका में दशमलव कॉलम से एक मान है।

मुझे लगता है कि यह विधि वर्णित विधि की तुलना में अच्छा है जहां वर्णों की श्रेणी विशेष रूप से एक और स्ट्रिंग के भीतर परिभाषित की गई है।

// range is numbers (48) through capital and lower case letters (122)
$range_start = 48;
$range_end   = 122;
$random_string = "";
$random_string_length = 10;

for ($i = 0; $i < $random_string_length; $i++) {
  $ascii_no = round( mt_rand( $range_start , $range_end ) ); // generates a number within the range
  // finds the character represented by $ascii_no and adds it to the random string
  // study **chr** function for a better understanding
  $random_string .= chr( $ascii_no );
}

echo $random_string;

और देखें:

  • chr फ़ंक्शन
  • mt_rand फ़ंक्शन

1
यह अच्छा है, हालांकि गैर-अल्फ़ान्यूमेरिक वर्ण उस ACSII श्रेणी में आते हैं।
बोवर

4

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन मैं एक वर्ग के साथ योगदान करना चाहता हूं, जिसे मैंने जेरेमी रुटेन के जवाब के आधार पर बनाया है और टिप्पणियों में सुझावों के साथ सुधार किया है:

    class RandomString
    {
      private static $characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
      private static $string;
      private static $length = 8; //default random string length

      public static function generate($length = null)
      {

        if($length){
          self::$length = $length;
        }

        $characters_length = strlen(self::$characters) - 1;

        for ($i = 0; $i < self::$length; $i++) {
          self::$string .= self::$characters[mt_rand(0, $characters_length)];
        }

        return self::$string;

      }

    }

3

सरल लोग .... लेकिन याद रखें कि प्रत्येक बाइट 0 से 255 के बीच यादृच्छिक होता है जो एक यादृच्छिक स्ट्रिंग के लिए ठीक होगा। यह भी याद रखें कि प्रत्येक बाइट का प्रतिनिधित्व करने के लिए आपके पास दो अक्षर होंगे।

$str = bin2hex(random_bytes(32));  // 64 character string returned

अब तक का सबसे अच्छा जवाब और सबसे छोटा कोड! यह अधिक उठाव प्राप्त करना चाहिए
सिल्ली

2

शायद मैं यहाँ कुछ याद किया, लेकिन यहाँ uniqid () फ़ंक्शन का उपयोग करने का एक तरीका है


2
uniqidकिसी भी तरह से यादृच्छिक नहीं है। यह पूरी तरह से अनुमानित है। यह प्रश्न विशेष रूप से छद्म आयामी स्ट्रिंग की तलाश में है।
meagar

2

मैंने केवल फ़ंक्शन के साथ खेलने के लिए निम्नलिखित त्वरित फ़ंक्शन बनाया है range()। यह बस किसी समय किसी की मदद कर सकता है।

Function pseudostring($length = 50) {

    // Generate arrays with characters and numbers
    $lowerAlpha = range('a', 'z');
    $upperAlpha = range('A', 'Z');
    $numeric = range('0', '9');

    // Merge the arrays
    $workArray = array_merge($numeric, array_merge($lowerAlpha, $upperAlpha));
    $returnString = "";

    // Add random characters from the created array to a string
    for ($i = 0; $i < $length; $i++) {
        $character = $workArray[rand(0, 61)];
        $returnString .= $character;
    }

    return $returnString;
}

2

आप निम्न कोड का उपयोग कर सकते हैं। यह मौजूदा कार्यों के समान है सिवाय इसके कि आप विशेष वर्ण गणना को बाध्य कर सकते हैं:

function random_string() {
    // 8 characters: 7 lower-case alphabets and 1 digit
    $character_sets = [
        ["count" => 7, "characters" => "abcdefghijklmnopqrstuvwxyz"],
        ["count" => 1, "characters" => "0123456789"]
    ];
    $temp_array = array();
    foreach ($character_sets as $character_set) {
        for ($i = 0; $i < $character_set["count"]; $i++) {
            $random = random_int(0, strlen($character_set["characters"]) - 1);
            $temp_array[] = $character_set["characters"][$random];
        }
    }
    shuffle($temp_array);
    return implode("", $temp_array);
}

1
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 generateRandomString();

1

यदि आप ऐसा करना बहुत आसान तरीका चाहते हैं, तो आप मौजूदा PHP फ़ंक्शंस पर झुक सकते हैं। यह मेरे द्वारा उपयोग किया जाने वाला कोड है:

substr( sha1( time() ), 0, 15 )

time()युग के बाद से आपको सेकंड में वर्तमान समय देता है, sha1()इसे 0-9a-f के स्ट्रिंग में संलग्न करता है, और substr()आपको एक लंबाई चुनने देता है। आपको वर्ण 0 पर शुरू नहीं करना है, और जो भी अंतर दो नंबरों के बीच है वह स्ट्रिंग की लंबाई होगी।


0

यह कुछ ऐसा है जो मैं उपयोग करता हूं:

$cryptoStrong = true; // can be false
$length = 16; // Any length you want
$bytes = openssl_random_pseudo_bytes($length, $cryptoStrong);
$randomString = bin2hex($bytes);

आप देख सकते हैं यहाँ openssl_random_pseudo_bytes के लिए दस्तावेज़ , और यहाँ BIN2HEX के लिए दस्तावेज़


0

जेरेमी का जवाब बहुत अच्छा है। यदि, मेरी तरह, आप रेंज को लागू करने के तरीके के बारे में अनिश्चित हैं (), तो आप रेंज का उपयोग करके मेरा संस्करण देख सकते हैं ()।

<?php
$character_array = array_merge(range('a', 'z'), range(0, 9));
$string = "";
    for($i = 0; $i < 6; $i++) {
        $string .= $character_array[rand(0, (count($character_array) - 1))];
    }
echo $string;
?>

यह ठीक वैसा ही काम करता है जैसा जेरेमी करता है लेकिन मर्ज किए गए सरणियों का उपयोग करता है जहां वह एक स्ट्रिंग का उपयोग करता है, और गिनती () का उपयोग करता है जहां वह स्ट्रलेन का उपयोग करता है ()।


2
यह होने की जरूरत हैrange('a','z');
मेहदी करमोसली

0

1 पंक्ति:

$FROM = 0; $TO = 'zzzz';
$code = base_convert(rand( $FROM ,base_convert( $TO , 36,10)),10,36);
echo $code;

0

आधुनिक तरीका यह है कि वास्तविक अशिष्टता के लिए प्रकार / संकेत / rand_int के साथ

function random_string(int $size): string
{
    $characters = array_merge(
        range(0, 9),
        range('A', 'Z')
    );

    $string = '';
    $max = count($characters) - 1;
    for ($i = 0; $i < $size; $i++) {
        $string .= $characters[random_int(0, $max)];
    }

    return $string;
}

0

पहले वांछित पात्रों को सूचीबद्ध करें

$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

Str_shuffle ($ string) फ़ंक्शन का उपयोग करें। यह फ़ंक्शन आपको एक बेतरतीब ढंग से कटा हुआ स्ट्रिंग प्रदान करेगा।

$alpha=substr(str_shuffle($chars), 0, 50);

50 स्ट्रिंग की लंबाई है।


0
public function randomString($length = 8)
{
    $characters = implode([
        'ABCDEFGHIJKLMNOPORRQSTUWVXYZ',
        'abcdefghijklmnoprqstuwvxyz',
        '0123456789',
        //'!@#$%^&*?'
    ]);

    $charactersLength = strlen($characters) - 1;
    $string           = '';

    while ($length) {
        $string .= $characters[mt_rand(0, $charactersLength)];
        --$length;
    }

    return $string;
}

लोअर और अपर केस स्ट्रिंग्स में आपके अलग-अलग कैरेक्टर हैं। और क्या इस कोड का यहां पहले से प्रकाशित अन्य सभी प्रकारों पर कोई लाभ है?
मगरास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.