सवाल यादृच्छिक 5 वर्ण स्ट्रिंग जेनरेट करें


मैं डुप्लीकेट प्राप्त करने की कम से कम संभावना के साथ सटीक 5 यादृच्छिक वर्ण स्ट्रिंग बनाना चाहता हूं। ऐसा करने का सबसे अच्छा तरीका क्या होगा? धन्यवाद।


73
2018-03-25 22:26


मूल


क्या आपके पास एक विशिष्ट वर्ण या केवल एक सेट है 0-9a-zA-Z ? - Yanick Rochon
@ यैनिक, केवल 0-9 ए-जेए-जेड - Peter
यह कोड गोल्फ चुनौती एक खोज हो सकती है: codegolf.stackexchange.com/questions/119226/... - Titus


जवाब:


$rand = substr(md5(microtime()),rand(0,26),5);

मेरा सबसे अच्छा अनुमान होगा - जब तक कि आप विशेष पात्रों की तलाश नहीं कर रहे हैं, भी:

$seed = str_split('abcdefghijklmnopqrstuvwxyz'
                 .'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
                 .'0123456789!@#$%^&*()'); // and any other characters
shuffle($seed); // probably optional since array_is randomized; this may be redundant
$rand = '';
foreach (array_rand($seed, 5) as $k) $rand .= $seed[$k];

उदाहरण

और, घड़ी के आधार पर एक के लिए (कम वृद्धि के बाद से कम टक्कर):

function incrementalHash($len = 5){
  $charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  $base = strlen($charset);
  $result = '';

  $now = explode(' ', microtime())[1];
  while ($now >= $base){
    $i = $now % $base;
    $result = $charset[$i] . $result;
    $now /= $base;
  }
  return substr($result, -5);
}

नोट: वृद्धिशील मतलब अनुमान लगाना आसान है; यदि आप इसे नमक या सत्यापन टोकन के रूप में उपयोग कर रहे हैं, तो नहीं। "डब्ल्यूसीडब्ल्यूबीबी" का एक नमक (अब) का मतलब है कि अब से 5 सेकंड "डब्ल्यूसीडब्ल्यूईजी" है)


121
2018-03-25 22:28



उपयोग करने में समस्या md5() हालांकि यह है कि आपको एक 16-वर्ण सेट (10 अंक और) से बना एक स्ट्रिंग मिलती है a सेवा मेरे f, यानी 4 बिट्स प्रति स्ट्रिंग कैरेक्टर)। यह कुछ उद्देश्यों के लिए पर्याप्त हो सकता है लेकिन क्रिप्टोग्राफ़िकल उद्देश्यों के लिए बहुत कम हो सकता है (16 प्रतीकों में से पांच वर्ण = 16 ^ 5 = 20 बिट्स = 1048576 संभावनाएं)। - Archimedix
array_rand($seed, 5) सरणी कुंजी लौटाएगा, मूल्य नहीं, इसलिए आपका कोड काम नहीं करेगा - alumi
मुझे लगता है कि एक का उपयोग कर क्रिप्टोग्राफिक हैश फ़ंक्शन यादृच्छिक वर्ण उत्पन्न करने के लिए कम से कम अनुचित है। - gronostaj
क्या यह भी शामिल करना संभव है ", ' और बैकस्लैश में $charset? क्या मुझे उन पात्रों को शामिल करने के लिए भागने के दृश्यों का उपयोग करने की आवश्यकता है? - Mai
दूसरा स्निपेट भी इसका उपयोग नहीं करता है $len इनपुट param ... क्या आप इसे भूल गए? - TechNyquist


अगर for लूप कम आपूर्ति पर हैं, यहां मैं क्या उपयोग करना चाहता हूं:

$s = substr(str_shuffle(str_repeat("0123456789abcdefghijklmnopqrstuvwxyz", 5)), 0, 5);

60
2018-03-26 00:34



दिलचस्प समाधान ... बहुत संक्षेप में, हालांकि मुझे आश्चर्य है कि यह उपयोग करने से तेज या धीमा है या नहीं। हालांकि बेंचमार्क पर परेशान नहीं किया जा सकता है :-) - Archimedix
@matthew str_shuffle लगातार डुप्लिकेट का उत्पादन करेगा - SCC
@ User2826057: str_shuffle('ab') देना होगा ab या ba लेकिन कभी नही aa। जोड़ना str_repeat इसके लिए अनुमति देता है। लेकिन उसने कहा, मैंने जो समाधान दिया वह वास्तव में गंभीर नहीं है ... हालांकि यह काम करता है। - Matthew
@Matthew दूसरी बार इस स्क्रिप्ट को चलाने पर, यह पहली बार एक ही कोड उत्पन्न करता है - SCC
ऐसा होने का एक 1/60466176 मौका है, मानते हैं कि आरएनजी समान रूप से वितरित है। - Matthew


एक तेज़ तरीका है कि सबसे अस्थिर पात्रों का उपयोग करना uniqid समारोह।

उदाहरण के लिए:

$rand = substr(uniqid('', true), -5);

20
2018-03-25 22:40





निम्नलिखित को डुप्लिकेशन का कम से कम मौका देना चाहिए (आप प्रतिस्थापित करना चाहते हैं mt_rand() एक बेहतर यादृच्छिक संख्या स्रोत के साथ उदा। से /dev/*random या GUIDs से):

<?php
    $characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    $result = '';
    for ($i = 0; $i < 5; $i++)
        $result .= $characters[mt_rand(0, 61)];
?>

संपादित करें:
यदि आप सुरक्षा के बारे में चिंतित हैं, वास्तव में, करते हैं नहीं उपयोग rand() या mt_rand(), और सत्यापित करें कि आपका यादृच्छिक डेटा डिवाइस वास्तव में एक डिवाइस उत्पन्न कर रहा है बिना सोचे समझे डेटा, एक नियमित फ़ाइल या कुछ अनुमानित नहीं है /dev/zeromt_rand() हानिकारक माना जाता है:
https://spideroak.com/blog/20121205114003-exploit-information-leaks-in-random-numbers-from-python-ruby-and-php

संपादित करें: यदि आपके पास PHP में ओपनएसएसएल समर्थन है, तो आप इसका उपयोग कर सकते हैं openssl_random_pseudo_bytes():

<?php
    $length = 5;
    $randomBytes = openssl_random_pseudo_bytes($length);
    $characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    $charactersLength = strlen($characters);
    $result = '';
    for ($i = 0; $i < $length; $i++)
        $result .= $characters[ord($randomBytes[$i]) % $charactersLength];
?>

12
2018-03-26 00:32



पहला उदाहरण $ परिणाम के साथ अधिक चालाक। = $ वर्ण [mt_rand (0, strlen ($ अक्षर) -1)] - hamboy75
उस स्थिति में आपको पहले से लंबाई निर्धारित करना चाहिए और इसे कम से कम एक चर में स्टोर करना चाहिए। का उपयोग करते हुए strlen() एक लूप में अनावश्यक ओवरहेड है, खासकर यदि आप पहले से ही जानते हैं कि इस दौरान चरित्र सेट बदलने वाला नहीं है। - Archimedix
मुझे शक है, PHP अनुकूलित है, वैसे भी यह एक विकल्प है :) - hamboy75


आप इसे इस तरह से आजमा सकते हैं:

$length = 5;

$randomletter = substr(str_shuffle("abcdefghijklmnopqrstuvwxyz"), 0, $length);

अधिक जानकारी: http://forum.arnlweb.com/viewtopic.php?f=7&t=25


7
2018-06-29 22:25





मैं हमेशा इसके लिए एक ही फ़ंक्शन का उपयोग करता हूं, आमतौर पर पासवर्ड उत्पन्न करने के लिए। उपयोग करना और उपयोगी होना आसान है।

function randPass($length, $strength=8) {
    $vowels = 'aeuy';
    $consonants = 'bdghjmnpqrstvz';
    if ($strength >= 1) {
        $consonants .= 'BDGHJLMNPQRSTVWXZ';
    }
    if ($strength >= 2) {
        $vowels .= "AEUY";
    }
    if ($strength >= 4) {
        $consonants .= '23456789';
    }
    if ($strength >= 8) {
        $consonants .= '@#$%';
    }

    $password = '';
    $alt = time() % 2;
    for ($i = 0; $i < $length; $i++) {
        if ($alt == 1) {
            $password .= $consonants[(rand() % strlen($consonants))];
            $alt = 0;
        } else {
            $password .= $vowels[(rand() % strlen($vowels))];
            $alt = 1;
        }
    }
    return $password;
}

6
2018-03-25 22:36



अच्छा कोड हालांकि $ alt हमेशा एक से 0 तक फ़्लिप करता है। क्या इसके बजाय $ alt को यादृच्छिक बनाना बेहतर नहीं होगा? - Nico Andrade


ऐसा प्रतीत होता है जैसे str_shuffle इसके लिए एक अच्छा उपयोग होगा। जो भी पात्र आप चाहते हैं उसके साथ शफल लें।

$my_rand_strng = substr(str_shuffle("ABCDEFGHIJKLMNOPQRSTUVWXYZ"), -5);

5
2017-09-12 16:08



दोनों PHP टी के लिए अच्छा है: php.net/manual/en/function.substr.php  php.net/manual/en/function.str-shuffle.php - Creeperstanson


$str = '';
$str_len = 8;
for($i = 0, $i < $str_len; $i++){
    //97 is ascii code for 'a' and 122 is ascii code for z
    $str .= chr(rand(97, 122));
}
return $str

3
2018-02-17 05:59