PHP: एक यादृच्छिक, अद्वितीय, अल्फ़ान्यूमेरिक स्ट्रिंग कैसे उत्पन्न करें?


380

सत्यापित लिंक में उपयोग के लिए संख्याओं और अक्षरों का उपयोग करके यादृच्छिक, अद्वितीय स्ट्रिंग उत्पन्न करना कैसे संभव होगा? जैसे जब आप किसी वेबसाइट पर एक खाता बनाते हैं, और यह आपको एक लिंक के साथ एक ईमेल भेजता है, और आपको अपने खाते को सत्यापित करने के लिए उस लिंक पर क्लिक करना होगा ... हाँ ... उनमें से एक।

मैं PHP का उपयोग करने वालों में से एक को कैसे उत्पन्न कर सकता हूं?

अद्यतन: बस के बारे में याद किया uniqid()। यह एक PHP फ़ंक्शन है जो माइक्रोसेकंड में वर्तमान समय के आधार पर एक विशिष्ट पहचानकर्ता उत्पन्न करता है। मुझे लगता है कि मैं इसका इस्तेमाल करूंगा।


आप सभी की जरूरत है तार और समान रूप से वितरित यादृच्छिक संख्याएँ हैं।
आर्टिलियस 10

10
हे एंड्रयू, आपको Scottसही उत्तर के रूप में चुनना चाहिए । स्कॉट OpenSSL के क्रिप्टोग्राफिक रूप से सुरक्षित सोकोडो-रैंडम नंबर जनरेटर (CSPRNG) का उपयोग कर रहा है जो आपके प्लेटफॉर्म के आधार पर एंट्रोपी के सबसे सुरक्षित स्रोत का चयन करेगा।
किश्ती

3
2015 के बाद इसे पढ़ने वाला कोई भी, कृपया यहां देखें: paragonie.com/blog/2015/07/… सबसे शीर्ष उत्तर कम या ज्यादा त्रुटिपूर्ण हैं ...
रगड़

ओपनएसएसएल और uniqidअसुरक्षित हैं। जैसे कुछ का उपयोग करें Random::alphanumericString($length)या Random::alphanumericHumanString($length)
कांव-कांव

जवाबों:


305

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

यदि आपको समय के साथ बिल्कुल विशिष्ट होने की आवश्यकता नहीं है:

md5(uniqid(rand(), true))

अन्यथा (आपने पहले ही अपने उपयोगकर्ता के लिए एक अद्वितीय लॉगिन निर्धारित कर दिया है):

md5(uniqid($your_user_login, true))

90
दोनों विधियां विशिष्टता की गारंटी नहीं देती हैं - md5 फ़ंक्शन के इनपुट की लंबाई इसके आउटपुट की लंबाई से अधिक है और en.wikipedia.org/wiki/Pigeonhole_principle के अनुसार टक्कर की गारंटी है। दूसरी ओर, "अद्वितीय" आईडी को प्राप्त करने के लिए हैश पर निर्भर होने वाली अधिक से अधिक आबादी, कम से कम एक टक्कर होने की संभावना अधिक होती है ( en.wikipedia.org/wiki/Birthday_problem देखें )। अधिकांश समाधानों के लिए संभावना छोटी हो सकती है लेकिन यह अभी भी मौजूद है।
डेरियस वलजैकक

12
यह यादृच्छिक मान उत्पन्न करने का एक सुरक्षित तरीका नहीं है। देखें स्कॉट का जवाब
बदमाश

4
ईमेल की पुष्टि के लिए जो अपेक्षाकृत जल्दी ही समाप्त हो जाते हैं, मुझे लगता है कि छोटी संभावना है कि एक व्यक्ति एक दिन किसी और के ईमेल की पुष्टि कर सकता है जो एक नगण्य जोखिम है। लेकिन आप हमेशा जाँच सकते हैं कि टोकन पहले से ही डीबी में मौजूद है और इसे बनाने के बाद यदि कोई मामला है तो नया चुनें। हालाँकि, आप जो समय लिख रहे हैं वह कोड का स्निपेट बर्बाद होने की संभावना है क्योंकि यह सबसे अधिक संभावना है कि इसे कभी भी नहीं चलाया जाएगा।
एंड्रयू

ध्यान दें कि md5 हेक्साडेसिमल मान लौटाता है, जिसका अर्थ है कि वर्ण सेट [0-9] और [af] तक सीमित है।
थिएज रिजेबेक

1
md5 में टक्कर हो सकती है, आपने बस बेकार का फायदा उठाया है
user151496

507

मैं बस देख रहा था कि इस समस्या को कैसे हल किया जाए, लेकिन मैं यह भी चाहता हूं कि मेरा फ़ंक्शन एक टोकन बनाने के लिए उपयोग किया जा सकता है जो पासवर्ड पुनर्प्राप्ति के लिए भी उपयोग किया जा सकता है। इसका मतलब यह है कि मुझे अनुमान लगाने के लिए टोकन की क्षमता को सीमित करने की आवश्यकता है। क्योंकि uniqidसमय पर आधारित है, और php.net के अनुसार "वापसी मूल्य सूक्ष्म समय ()" से थोड़ा अलग है, uniqidमानदंडों को पूरा नहीं करता है। openssl_random_pseudo_bytes()क्रिप्टोग्राफिक रूप से सुरक्षित टोकन उत्पन्न करने के बजाय PHP का उपयोग करने की सलाह देते हैं ।

एक त्वरित, संक्षिप्त और बिंदु उत्तर के लिए है:

bin2hex(openssl_random_pseudo_bytes($bytes))

जो लंबाई = $ बाइट्स के अल्फ़ान्यूमेरिक वर्णों का एक यादृच्छिक स्ट्रिंग उत्पन्न करेगा। 2. दुर्भाग्य से इसमें केवल एक वर्णमाला है [a-f][0-9], लेकिन यह काम करता है।


नीचे सबसे मजबूत कार्य है जो मैं कर सकता हूं जो मानदंडों को संतुष्ट करता है (यह एरिक के उत्तर का एक कार्यान्वित संस्करण है)।

function crypto_rand_secure($min, $max)
{
    $range = $max - $min;
    if ($range < 1) return $min; // not so random...
    $log = ceil(log($range, 2));
    $bytes = (int) ($log / 8) + 1; // length in bytes
    $bits = (int) $log + 1; // length in bits
    $filter = (int) (1 << $bits) - 1; // set all lower bits to 1
    do {
        $rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
        $rnd = $rnd & $filter; // discard irrelevant bits
    } while ($rnd > $range);
    return $min + $rnd;
}

function getToken($length)
{
    $token = "";
    $codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
    $codeAlphabet.= "0123456789";
    $max = strlen($codeAlphabet); // edited

    for ($i=0; $i < $length; $i++) {
        $token .= $codeAlphabet[crypto_rand_secure(0, $max-1)];
    }

    return $token;
}

crypto_rand_secure($min, $max)rand()या के बदले में एक बूंद के रूप में काम करता है mt_rand। यह $ मिनट और $ अधिकतम के बीच एक यादृच्छिक संख्या बनाने में मदद करने के लिए खुलता है_sandom_pseudo_bytes का उपयोग करता है।

getToken($length)टोकन के भीतर उपयोग करने के लिए एक वर्णमाला बनाता है और फिर लंबाई की एक स्ट्रिंग बनाता है $length

EDIT: मैंने स्रोत का हवाला देते हुए उपेक्षा की - http://us1.php.net/manual/en/function.openssl-random-pseudo-bytes.php#104322

EDIT (PHP7): PHP7 की रिलीज़ के साथ, मानक पुस्तकालय में अब दो नए कार्य हैं जो ऊपर दिए गए crypto_rand_secure फ़ंक्शन को बदल / सुधार / सरल कर सकते हैं। random_bytes($length)तथाrandom_int($min, $max)

http://php.net/manual/en/function.random-bytes.php

http://php.net/manual/en/function.random-int.php

उदाहरण:

function getToken($length){
    $token = "";
    $codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
    $codeAlphabet.= "0123456789";
    $max = strlen($codeAlphabet);

    for ($i=0; $i < $length; $i++) {
        $token .= $codeAlphabet[random_int(0, $max-1)];
    }

    return $token;
}

2
माना। सादा पासवर्ड भंडारण भयानक है! (मैं ब्लोफिश का उपयोग करता हूं।) लेकिन टोकन के उत्पन्न होने के बाद यह टोकन धारक को पासवर्ड रीसेट करने की अनुमति देता है, इसलिए टोकन मान्य होने के साथ ही पासवर्ड समतुल्य होता है (और ऐसा माना जाता है)।
स्कॉट

23
अरे, मैंने आपके उत्कृष्ट कोड को सुविधाजनक कोहना पाठ :: यादृच्छिक () पद्धति की कार्यक्षमता के साथ जोड़ दिया है और इस जिस्ट का निर्माण किया है
15

9
उत्तम! मैंने इसकी लंबाई के रूप में 10 वर्णों के साथ परीक्षण किया। 100000 टोकन और अभी भी कोई डुप्लिकेट नहीं!
शरबत ५१२

5
मैंने इस प्रक्रिया का इस्तेमाल किया और इसे सुपर स्लो पाया। 36 की लंबाई के साथ यह देव सर्वर पर समय समाप्त हो गया। 24 की लंबाई के साथ यह अभी भी लगभग 30 सेकंड लेता है। मुझे यकीन नहीं है कि मैंने क्या गलत किया, लेकिन यह मेरे लिए बहुत धीमा था और मैंने दूसरे समाधान का विकल्प चुना।
शेन

5
आप बड़ी वर्णमाला के साथ एक छोटी स्ट्रिंग प्राप्त करने के base64_encodeबजाय भी उपयोग कर सकते हैं bin2hex
एरजियांग

91

सबसे अधिक मतदान समाधान का वस्तु-उन्मुख संस्करण

मैंने स्कॉट के उत्तर के आधार पर एक वस्तु-उन्मुख समाधान बनाया है :

<?php

namespace Utils;

/**
 * Class RandomStringGenerator
 * @package Utils
 *
 * Solution taken from here:
 * http://stackoverflow.com/a/13733588/1056679
 */
class RandomStringGenerator
{
    /** @var string */
    protected $alphabet;

    /** @var int */
    protected $alphabetLength;


    /**
     * @param string $alphabet
     */
    public function __construct($alphabet = '')
    {
        if ('' !== $alphabet) {
            $this->setAlphabet($alphabet);
        } else {
            $this->setAlphabet(
                  implode(range('a', 'z'))
                . implode(range('A', 'Z'))
                . implode(range(0, 9))
            );
        }
    }

    /**
     * @param string $alphabet
     */
    public function setAlphabet($alphabet)
    {
        $this->alphabet = $alphabet;
        $this->alphabetLength = strlen($alphabet);
    }

    /**
     * @param int $length
     * @return string
     */
    public function generate($length)
    {
        $token = '';

        for ($i = 0; $i < $length; $i++) {
            $randomKey = $this->getRandomInteger(0, $this->alphabetLength);
            $token .= $this->alphabet[$randomKey];
        }

        return $token;
    }

    /**
     * @param int $min
     * @param int $max
     * @return int
     */
    protected function getRandomInteger($min, $max)
    {
        $range = ($max - $min);

        if ($range < 0) {
            // Not so random...
            return $min;
        }

        $log = log($range, 2);

        // Length in bytes.
        $bytes = (int) ($log / 8) + 1;

        // Length in bits.
        $bits = (int) $log + 1;

        // Set all lower bits to 1.
        $filter = (int) (1 << $bits) - 1;

        do {
            $rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));

            // Discard irrelevant bits.
            $rnd = $rnd & $filter;

        } while ($rnd >= $range);

        return ($min + $rnd);
    }
}

प्रयोग

<?php

use Utils\RandomStringGenerator;

// Create new instance of generator class.
$generator = new RandomStringGenerator;

// Set token length.
$tokenLength = 32;

// Call method to generate random string.
$token = $generator->generate($tokenLength);

कस्टम वर्णमाला

यदि आवश्यक हो तो आप कस्टम वर्णमाला का उपयोग कर सकते हैं। बस एक स्ट्रिंग को कंस्ट्रक्टर या सेटर को सपोर्टेड चर के साथ पास करें:

<?php

$customAlphabet = '0123456789ABCDEF';

// Set initial alphabet.
$generator = new RandomStringGenerator($customAlphabet);

// Change alphabet whenever needed.
$generator->setAlphabet($customAlphabet);

यहाँ आउटपुट नमूने हैं

SRniGU2sRQb2K1ylXKnWwZr4HrtdRgrM
q1sRUjNq1K9rG905aneFzyD5IcqD4dlC
I0euIWffrURLKCCJZ5PQFcNUCto6cQfD
AKwPJMEM5ytgJyJyGqoD5FQwxv82YvMr
duoRF6gAawNOEQRICnOUNYmStWmOpEgS
sdHUkEn4565AJoTtkc8EqJ6cC4MLEHUx
eVywMdYXczuZmHaJ50nIVQjOidEVkVna
baJGt7cdLDbIxMctLsEBWgAw5BByP5V0
iqT0B2obq3oerbeXkDVLjZrrLheW4d8f
OUQYCny6tj2TYDlTuu1KsnUyaLkeObwa

मुझे उम्मीद है कि यह किसी की मदद करेगा। चीयर्स!


मुझे क्षमा करें लेकिन मैं इस चीज़ को कैसे चलाऊँ? मैंने किया $obj = new RandomStringGenerator;लेकिन मुझे किस विधि से बुलाया जाना चाहिए? धन्यवाद।
sg552

@ sg552, आपको generateऊपर उदाहरण के रूप में विधि को कॉल करना चाहिए । परिणामी स्ट्रिंग की लंबाई निर्दिष्ट करने के लिए इसे पूर्णांक पास करें।
स्लाव फोमिन II

धन्यवाद यह मेरे लिए काम करता है, लेकिन Custom Alphabetनहीं किया। मैं गूंजने पर खाली आउटपुट मिला। वैसे भी मुझे यकीन नहीं है कि 2 उदाहरण का उपयोग क्या है, Custom Alphabetइसलिए मुझे लगता है कि मैं पहले उदाहरण के साथ ही रहूंगा। धन्यवाद।
sg552

1
जब तक कि आपकी परियोजना बेतरतीब ढंग से उत्पन्न कोड पर निर्भर न हो जाए, तब तक बहुत अच्छा है, लेकिन बहुत ज्यादा
ओवरकिल है

1
हाँ अच्छा है, लेकिन overkill, विशेष रूप से यह देखते हुए कि यह बहुत ज्यादा है php 5.7 के लिए अबाधित है
एंड्रयू

39

मुझे देर हो गई है लेकिन मैं स्कॉट के जवाब द्वारा प्रदान किए गए कार्यों के आधार पर कुछ अच्छे शोध डेटा के साथ यहां हूं । इसलिए मैंने इस 5-दिवसीय लंबे स्वचालित परीक्षण के लिए सिर्फ एक डिजिटल ओशन ड्रॉपलेट की स्थापना की और एक MySQL डेटाबेस में उत्पन्न अनोखे तार को संग्रहीत किया।

इस परीक्षण अवधि के दौरान, मैंने 5 अलग-अलग लंबाई (5, 10, 15, 20, 50) का उपयोग किया और प्रत्येक लंबाई के लिए +/- 0.5 मिलियन रिकॉर्ड डाले गए। मेरे परीक्षण के दौरान, केवल लंबाई 5 उत्पन्न +/- 3K 0.5 मिलियन से बाहर डुप्लिकेट और शेष लंबाई किसी भी डुप्लिकेट उत्पन्न नहीं किया। इसलिए हम कह सकते हैं कि यदि हम स्कॉट की कार्यप्रणाली के साथ 15 या उससे अधिक की लंबाई का उपयोग करते हैं, तो हम अत्यधिक विश्वसनीय अद्वितीय तार उत्पन्न कर सकते हैं। यहां मेरा शोध डेटा दिखाने वाली तालिका है:

यहां छवि विवरण दर्ज करें

अद्यतन: मैंने इन कार्यों का उपयोग करके एक सरल हरोकू ऐप बनाया है जो टोकन को JSON प्रतिक्रिया के रूप में देता है। ऐप को https://uniquestrings.herokuapp.com/api/token?length=15 पर एक्सेस किया जा सकता है

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


33

आप यूयूआईडी (विश्वविद्यालय की विशिष्ट पहचानकर्ता) का उपयोग कर सकते हैं, इसका उपयोग किसी भी उद्देश्य के लिए, उपयोगकर्ता प्रमाणीकरण स्ट्रिंग से भुगतान लेनदेन आईडी के लिए किया जा सकता है।

एक यूयूआईडी 16-ऑक्टेट (128-बिट) संख्या है। अपने विहित रूप में, एक यूयूआईडी को 32 हेक्साडेसिमल अंकों द्वारा दर्शाया जाता है, जो हाइफ़न द्वारा अलग-अलग पांच समूहों में प्रदर्शित होते हैं, कुल 36 वर्ण (32 अल्फ़ान्यूमेरिक वर्ण और चार अफ़्स) के लिए 8-4-4-4-12 रूप में।

function generate_uuid() {
    return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
        mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),
        mt_rand( 0, 0xffff ),
        mt_rand( 0, 0x0C2f ) | 0x4000,
        mt_rand( 0, 0x3fff ) | 0x8000,
        mt_rand( 0, 0x2Aff ), mt_rand( 0, 0xffD3 ), mt_rand( 0, 0xff4B )
    );

}

// कॉलिंग फ़ंसीशन

$transationID = generate_uuid();

कुछ उदाहरण आउटपुट इस तरह होंगे:

E302D66D-87E3-4450-8CB6-17531895BF14
22D288BC-7289-442B-BEEA-286777D559F2
51B4DE29-3B71-4FD2-9E6C-071703E1FF31
3777C8C6-9FF5-4C78-AAA2-08A47F555E81
54B91C72-2CF4-4501-A6E9-02A60DCBAE4C
60F75C7C-1AE3-417B-82C8-14D456542CD7
8DE0168D-01D3-4502-9E59-10D665CEBCB2

आशा है कि यह भविष्य में किसी की मदद करता है :)


शानदार लग रहा है, मेरी सूची में जोड़ा गया!
मुस्तफा एर्दोगन

32

यह फ़ंक्शन संख्याओं और अक्षरों का उपयोग करके एक यादृच्छिक कुंजी उत्पन्न करेगा:

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

    for ($i = 0; $i < $length; $i++) {
        $key .= $keys[array_rand($keys)];
    }

    return $key;
}

echo random_string(50);

उदाहरण आउटपुट:

zsd16xzv3jsytnp87tk7ygv73k8zmr0ekh6ly7mxaeyeh46oe8

6
थोड़ी देर के बाद आप एक ही नंबर पर आते हैं
शार्पलेस 512

1
यह पूरी तरह से यादृच्छिक नहीं है क्योंकि इसमें एक ही बार एक से अधिक चॉकर नहीं होंगे।
एरिकपी

16

मैं इस एक लाइनर का उपयोग करता हूं:

base64_encode(openssl_random_pseudo_bytes(3 * ($length >> 2)));

जहां लंबाई वांछित स्ट्रिंग की लंबाई (4 से विभाज्य है, अन्यथा यह निकटतम संख्या में 4 से विभाज्य हो जाती है)


6
यह हमेशा केवल अल्फ़ान्यूमेरिक वर्ण वापस नहीं करता है। ऐसा लगता है कि वर्ण हो सकते हैं==
user3459110

1
यदि किसी URL में उपयोग किया जाता है, तो इसका उपयोग किया base64url_encodeजा सकता है, यहाँ देखें: php.net/manual/en/function.base64-encode.php
पॉल

9

11 वर्णों की यादृच्छिक संख्या उत्पन्न करने या अपनी आवश्यकता के अनुसार संख्या बदलने के लिए नीचे दिए गए कोड का उपयोग करें।

$randomNum=substr(str_shuffle("0123456789abcdefghijklmnopqrstvwxyz"), 0, 11);

या हम यादृच्छिक संख्या उत्पन्न करने के लिए कस्टम फ़ंक्शन का उपयोग कर सकते हैं

 function randomNumber($length){
     $numbers = range(0,9);
     shuffle($numbers);
     for($i = 0;$i < $length;$i++)
        $digits .= $numbers[$i];
     return $digits;
 }

 //generate random number
 $randomNum=randomNumber(11);

3
यह कभी भी "आआआआआ आआआआआ" या "आआआआआआआआआआ आआआआआआआआआआआआदः" के साथ पैदा नहीं हो सकता। यह सिर्फ वर्णमाला के यादृच्छिक क्रमपरिवर्तन का एक विकल्प चुनता है। 11 वर्ण लंबे तार में केवल V (11,35) = 288 संभावित मान होते हैं। यदि आप तार अद्वितीय होने की उम्मीद करते हैं तो इसका उपयोग न करें!
21

@Peping तो करते हैंsubstr(str_shuffle(str_repeat('0123456789abcdefghijklmnopqrstvwxyz', 36)), 0, 11);
टिम हॉलमैन

7
  1. अपने पसंदीदा यादृच्छिक-संख्या जनरेटर का उपयोग करके एक यादृच्छिक संख्या उत्पन्न करें
  2. गुणा करें और अपने कोड वर्णमाला में वर्णों की संख्या से मेल खाते नंबर पाने के लिए इसे विभाजित करें
  3. अपने कोड वर्णमाला में उस इंडेक्स पर आइटम प्राप्त करें।
  4. 1) से दोहराएं जब तक आपके पास लंबाई है आप चाहते हैं

जैसे (छद्म कोड में)

int myInt = random(0, numcharacters)
char[] codealphabet = 'ABCDEF12345'
char random = codealphabet[i]
repeat until long enough

सैद्धांतिक रूप से, यह संभावित रूप से एक ही स्ट्रिंग को एक से अधिक बार उत्पन्न नहीं कर सकता है?
फ्रीजक

4

यहाँ आप के लिए परम अद्वितीय आईडी जनरेटर है। मेरे द्वारा बनाया गया।

<?php
$d=date ("d");
$m=date ("m");
$y=date ("Y");
$t=time();
$dmt=$d+$m+$y+$t;    
$ran= rand(0,10000000);
$dmtran= $dmt+$ran;
$un=  uniqid();
$dmtun = $dmt.$un;
$mdun = md5($dmtran.$un);
$sort=substr($mdun, 16); // if you want sort length code.

echo $mdun;
?>

आप अपनी आईडी के लिए अपनी पसंद के अनुसार किसी भी 'var' को प्रतिध्वनित कर सकते हैं। लेकिन $ mdun बेहतर है, आप बेहतर कोड के लिए md5 को sha1 में बदल सकते हैं लेकिन यह बहुत लंबा होगा जिसकी आपको आवश्यकता नहीं है।

धन्यवाद।


7
इस मामले में यादृच्छिकता यादृच्छिक लिखित कोड की गारंटी है, है ना?
डैनियल कुचल

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

4

वास्तव में यादृच्छिक स्ट्रिंग्स के लिए, आप उपयोग कर सकते हैं

<?php

echo md5(microtime(true).mt_Rand());

आउटपुट:

40a29479ec808ad4bcff288a48a25d5c

इसलिए यदि आप एक ही समय में कई बार स्ट्रिंग उत्पन्न करने का प्रयास करते हैं, तो आपको अलग-अलग आउटपुट मिलेगा।


4

जब आप एक यादृच्छिक पासवर्ड उत्पन्न करने की कोशिश कर रहे हैं:

  • पहले बेतरतीब ढंग से यादृच्छिक बाइट्स का एक सुरक्षित सेट जनरेट करें

  • दूसरा उन यादृच्छिक बाइट्स को एक मुद्रण योग्य स्ट्रिंग में बदल रहा है

अब, php में यादृच्छिक बाइट्स उत्पन्न करने के कई तरीके हैं:

$length = 32;

//PHP 7+
$bytes= random_bytes($length);

//PHP < 7
$bytes= openssl_random_pseudo_bytes($length);

फिर आप इन यादृच्छिक बाइट्स को प्रिंट करने योग्य स्ट्रिंग में बदलना चाहते हैं:

आप bin2hex का उपयोग कर सकते हैं :

$string = bin2hex($bytes);

या base64_encode :

$string = base64_encode($bytes);

हालाँकि, ध्यान दें कि यदि आप base64 का उपयोग करते हैं तो आप स्ट्रिंग की लंबाई को नियंत्रित नहीं करते हैं। आप ऐसा करने के लिए bin2hex का उपयोग कर सकते हैं, 32 बाइट्स का उपयोग 64 char स्ट्रिंग में बदल जाएगा । लेकिन यह केवल ईवीएन स्ट्रिंग में ही काम करेगा ।

तो मूल रूप से आप बस कर सकते हैं :

$length = 32;

if(PHP_VERSION>=7){
    $bytes= random_bytes($length);
}else{
    $bytes= openssl_random_pseudo_bytes($length);
} 

$string = bin2hex($bytes);


2
function random_string($length = 8) {
    $alphabets = range('A','Z');
    $numbers = range('0','9');
    $additional_characters = array('_','=');
    $final_array = array_merge($alphabets,$numbers,$additional_characters);
       while($length--) {
      $key = array_rand($final_array);

      $password .= $final_array[$key];
                        }
  if (preg_match('/[A-Za-z0-9]/', $password))
    {
     return $password;
    }else{
    return  random_string();
    }

 }

2

यह एक सरल कार्य है जो आपको लेटर्स और नंबर्स (अल्फ़ान्यूमेरिक) वाले यादृच्छिक तार उत्पन्न करने की अनुमति देता है। आप स्ट्रिंग की लंबाई भी सीमित कर सकते हैं। इन यादृच्छिक तारों का उपयोग विभिन्न उद्देश्यों के लिए किया जा सकता है, जिनमें शामिल हैं: रेफरल कोड, प्रोमोशनल कोड, कूपन कोड। फंक्शंस PHP के कार्यों का अनुसरण करने पर निर्भर करता है: base_convert, sha1, uniqid, mt_rand

function random_code($length)
{
  return substr(base_convert(sha1(uniqid(mt_rand())), 16, 36), 0, $length);
}

echo random_code(6);

/*sample output
* a7d9e8
* 3klo93
*/

1

पिछले उदाहरणों को पढ़ने के बाद मैं इसके साथ आया:

protected static $nonce_length = 32;

public static function getNonce()
{
    $chars = array();
    for ($i = 0; $i < 10; $i++)
        $chars = array_merge($chars, range(0, 9), range('A', 'Z'));
    shuffle($chars);
    $start = mt_rand(0, count($chars) - self::$nonce_length);
    return substr(join('', $chars), $start, self::$nonce_length);
}

मैं 10 बार सरणी [0-9, AZ] की नकल करता हूं और तत्वों को फेरबदल करता हूं, क्योंकि मुझे रूट () के लिए एक यादृच्छिक प्रारंभ बिंदु मिलता है () अधिक 'रचनात्मक' होने के लिए :) आप जोड़ सकते हैं [az] और अन्य तत्व सरणी, डुप्लिकेट कम या ज्यादा, मुझसे ज्यादा रचनात्मक हो


1

सत्यापन लिंक से निपटने के दौरान मुझे हैश कीज़ का उपयोग करना पसंद है। मैं माइक्रोटाइम और हैशिंग का उपयोग करने की सलाह दूंगा, क्योंकि एमडी 5 का उपयोग करने का कोई कारण नहीं होना चाहिए क्योंकि माइक्रोटाइम के बंद होने के बाद से कुंजी समान होनी चाहिए।

  1. $key = md5(rand());
  2. $key = md5(microtime());

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

}

?>

उपरोक्त फ़ंक्शन आपको एक यादृच्छिक स्ट्रिंग उत्पन्न करेगा जो कि 11 वर्णों की लंबाई है।


1

यदि आप PHP में एक अद्वितीय स्ट्रिंग उत्पन्न करना चाहते हैं, तो निम्न प्रयास करें।

md5(uniqid().mt_rand());

इसमें,

uniqid()- यह अद्वितीय स्ट्रिंग उत्पन्न करेगा। यह फ़ंक्शन टाइमस्टैम्प आधारित विशिष्ट पहचानकर्ता को एक स्ट्रिंग के रूप में देता है।

mt_rand() - यादृच्छिक संख्या उत्पन्न करें।

md5() - यह हैश स्ट्रिंग उत्पन्न करेगा।


0

स्कॉट, हाँ आप बहुत लिखते हैं और अच्छा समाधान है! धन्यवाद।

मुझे अपने प्रत्येक उपयोगकर्ता के लिए विशिष्ट API टोकन उत्पन्न करने की भी आवश्यकता है। निम्नलिखित मेरा दृष्टिकोण है, मैंने उपयोगकर्ता जानकारी (उपयोगकर्ता नाम और उपयोगकर्ता नाम) का उपयोग किया है:

public function generateUniqueToken($userid, $username){

        $rand = mt_rand(100,999);
    $md5 = md5($userid.'!(&^ 532567_465 ///'.$username);

    $md53 = substr($md5,0,3);
    $md5_remaining = substr($md5,3);

    $md5 = $md53. $rand. $userid. $md5_remaining;

    return $md5;
}

कृपया देखें और मुझे बताएं कि क्या कोई सुधार मैं कर सकता हूं। धन्यवाद


0

यहाँ मैं अपनी एक परियोजना का उपयोग कर रहा हूँ, यह बहुत अच्छा काम कर रहा है और यह एक अद्वितीय रेंज टोकन बनाता है :

$timestampz=time();

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


$tokenparta = generateRandomString();


$token = $timestampz*3 . $tokenparta;

echo $token;

कृपया ध्यान दें कि मैंने टाइमस्टैम्प को तीन से गुणा किया है ताकि जो कोई भी उपयोगकर्ता सोच रहा हो कि यह टोकन कैसे उत्पन्न होता है;)

मुझे उम्मीद है यह मदद करेगा :)


1
"कृपया ध्यान दें कि मैंने टाइमस्टैम्प को तीन से गुणा किया है जो कोई भी उपयोगकर्ता के लिए भ्रम पैदा कर सकता है कि यह टोकन कैसे उत्पन्न होता है" obfuscation stackoverflow.com/questions/533965// के
हैरी

यह एक "ऑब्सफिकेशन के माध्यम से सुरक्षा" नहीं है क्योंकि टाइमस्टैम्प को तब उत्पन्न होने वाले यादृच्छिक स्ट्रिंग में जोड़ा जाता है, और यह वास्तविक अंतिम स्ट्रिंग है जो हम वापस लौटते हैं;)
कासज़ोनी फेरेंज़


0

हम इस स्ट्रिंग की दो लाइन का उपयोग कर सकते हैं अद्वितीय स्ट्रिंग उत्पन्न करने के लिए पुनरावृत्ति के लगभग 10000000 बार परीक्षण किया गया है

  $sffledStr= str_shuffle('abscdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()_-+');
    $uniqueString = md5(time().$sffledStr);

0

मैं हमेशा एक कस्टम यादृच्छिक अल्फ़ान्यूमेरिक स्ट्रिंग उत्पन्न करने के लिए इस फ़ंक्शन का उपयोग करता हूं ... आशा है कि यह मदद करेगा।

<?php
  function random_alphanumeric($length) {
    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ12345689';
    $my_string = '';
    for ($i = 0; $i < $length; $i++) {
      $pos = mt_rand(0, strlen($chars) -1);
      $my_string .= substr($chars, $pos, 1);
    }
    return $my_string;
  }
  echo random_alphanumeric(50); // 50 characters
?>

यह उदाहरण के लिए उत्पन्न करता है: Y1FypdjVbFCFK6Gh9FDJpe6dciwJEfV6MQGpJqAfuijaYSZ86g

यदि आप एक और स्ट्रिंग के साथ तुलना करना चाहते हैं तो सुनिश्चित करें कि यह एक अनूठा अनुक्रम है आप इस चाल का उपयोग कर सकते हैं ...

$string_1 = random_alphanumeric(50);
$string_2 = random_alphanumeric(50);
while ($string_1 == $string_2) {
  $string_1 = random_alphanumeric(50);
  $string_2 = random_alphanumeric(50);
  if ($string_1 != $string_2) {
     break;
  }
}
echo $string_1;
echo "<br>\n";
echo $string_2;

यह दो अद्वितीय तार उत्पन्न करता है:

qsBDs4JOoVRfFxyLAOGECYIsWvpcpMzAO9pypwxsqPKeAmYLOi

Ti3kE1WfGgTNxQVXtbNNbhhvvapnaUfGMVJecHkUjHbuCb85pF

आशा है कि यह आप के लिए क्या देख रहे हैं ...


0

गैर-अल्फ़ान्यूमेरिक वर्णों को त्यागकर आधार 64 को अल्फ़ान्यूमेरिक में बदलना एक सरल उपाय है।

यह एक क्रिप्टोग्राफिक रूप से सुरक्षित परिणाम के लिए random_bytes () का उपयोग करता है।

function random_alphanumeric(int $length): string
{
    $result='';
    do
    {
        //Base 64 produces 4 characters for each 3 bytes, so most times this will give enough bytes in a single pass
        $bytes=random_bytes(($length+3-strlen($result))*2);
        //Discard non-alhpanumeric characters
        $result.=str_replace(['/','+','='],['','',''],base64_encode($bytes));
        //Keep adding characters until the string is long enough
        //Add a few extra because the last 2 or 3 characters of a base 64 string tend to be less diverse
    }while(strlen($result)<$length+3);
    return substr($result,0,$length);
}


-1

मेरा मानना ​​है कि सभी मौजूदा विचारों के साथ समस्या यह है कि वे संभवत: अद्वितीय हैं, लेकिन निश्चित रूप से अद्वितीय नहीं हैं (जैसा कि डेरियस वाल्जिक के उत्तर में बताया गया है)। मेरे पास एक समाधान है जो वास्तव में अद्वितीय है। इसके लिए आवश्यक है कि आपकी स्क्रिप्ट में किसी प्रकार की मेमोरी हो। मेरे लिए यह एक SQL डेटाबेस है। तुम भी बस एक फ़ाइल के लिए कहीं लिख सकते हैं। दो कार्यान्वयन हैं:

पहली विधि: दो क्षेत्रों के बजाय 1 है कि विशिष्टता प्रदान करते हैं। पहला फ़ील्ड एक आईडी नंबर है जो यादृच्छिक नहीं है, लेकिन अद्वितीय है (पहली आईडी 1, दूसरी 2 ...) है। यदि आप SQL का उपयोग कर रहे हैं, तो बस AUTO_INCREMENT संपत्ति के साथ ID फ़ील्ड को परिभाषित करें। दूसरा क्षेत्र अद्वितीय नहीं है, लेकिन यादृच्छिक है। यह उन अन्य तकनीकों के साथ उत्पन्न किया जा सकता है जिन्हें लोगों ने पहले ही उल्लेख किया है। स्कॉट का विचार अच्छा था, लेकिन md5 सुविधाजनक है और संभवतः अधिकांश उद्देश्यों के लिए पर्याप्त अच्छा है:

$random_token = md5($_SERVER['HTTP_USER_AGENT'] . time());

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


-1

आप इस कोड का उपयोग कर सकते हैं, मुझे आशा है कि यह आपके लिए उपयोगी होगा।

function rand_code($len)
{
 $min_lenght= 0;
 $max_lenght = 100;
 $bigL = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 $smallL = "abcdefghijklmnopqrstuvwxyz";
 $number = "0123456789";
 $bigB = str_shuffle($bigL);
 $smallS = str_shuffle($smallL);
 $numberS = str_shuffle($number);
 $subA = substr($bigB,0,5);
 $subB = substr($bigB,6,5);
 $subC = substr($bigB,10,5);
 $subD = substr($smallS,0,5);
 $subE = substr($smallS,6,5);
 $subF = substr($smallS,10,5);
 $subG = substr($numberS,0,5);
 $subH = substr($numberS,6,5);
 $subI = substr($numberS,10,5);
 $RandCode1 = str_shuffle($subA.$subD.$subB.$subF.$subC.$subE);
 $RandCode2 = str_shuffle($RandCode1);
 $RandCode = $RandCode1.$RandCode2;
 if ($len>$min_lenght && $len<$max_lenght)
 {
 $CodeEX = substr($RandCode,0,$len);
 }
 else
 {
 $CodeEX = $RandCode;
 }
 return $CodeEX;
}

PHP में रैंडम कोड जनरेटर के बारे में विवरण


-2

अनावश्यक लूप्स को हटाकर ऊपर दिए गए स्कॉट्स कोड को सरल बनाना जो कि बुरी तरह से धीमा हो रहा है और इसे कॉलिंग से अधिक सुरक्षित नहीं बनाता है, केवल एक बार खुलता है।

function crypto_rand_secure($min, $max)
{
 $range = $max - $min;
 if ($range < 1) return $min; // not so random...
 $log = ceil(log($range, 2));
 $bytes = (int) ($log / 8) + 1; // length in bytes
 $rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
 return $min + $rnd%$range;
}

function getToken($length)
{
 return bin2hex(openssl_random_pseudo_bytes($length)
}

दुर्भाग्य से, मैं आपसे सहमत नहीं हो सकता कि यह crypto_rand_secure फ़ंक्शन का एक उपयुक्त सरलीकरण है। लूप modulo पूर्वाग्रह से बचने के लिए आवश्यक है जो तब होता है जब आप एक बेतरतीब ढंग से उत्पन्न संख्या का परिणाम लेते हैं और फिर एक संख्या से इसे मापते हैं जो सीमा को विभाजित करता है। en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#Modulo_bias । सीमा के बाहर किसी भी संख्या को फेंकने और एक नए नंबर का चयन करने के लिए लूप का उपयोग करके, यह इस पूर्वाग्रह से बचा जाता है। stackoverflow.com/questions/10984974/…
स्कॉट

@ पोस्ट, वह पोस्ट रैंड () के बारे में है। हालाँकि, इस मामले में, यह पहले से ही ध्यान रखता है कि बेकार में लूप्सल_रैंडमोन_सेसेडो_बीट्स इतना लूप लें।
माबेल

1
gist.github.com/anonymous/87e3ae6fd3320447f46b973e75c2ea85 - कृपया इस स्क्रिप्ट को चलाएं। आप देखेंगे कि परिणामों का वितरण यादृच्छिक नहीं है। 0-55 के बीच की संख्या 56-100 के बीच की संख्या की तुलना में अधिक होती है। opensslयह कारण नहीं है, यह आपके रिटर्न स्टेटमेंट में मोडुलो पूर्वाग्रह के कारण है। 100 (रेंज) 255 (1 बाइट) को समान रूप से विभाजित नहीं करता है और इन परिणामों का कारण बनता है। आपके उत्तर के साथ मेरा सबसे बड़ा मुद्दा यह है कि आप यह कहते हैं कि फंक्शन लूप का उपयोग करने के लिए उतना ही सुरक्षित है, जो कि गलत है। Crypto_rand_secure का आपका कार्यान्वयन क्रिप्टोग्राफ़िक रूप से सुरक्षित नहीं है और भ्रामक है।
स्कॉट

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

2
यह उत्तर बुरी सूचना का प्रचार करता है। आप सही हैं कि लूप opensslअधिक सुरक्षित नहीं बनाता है , लेकिन अधिक महत्वपूर्ण बात यह है कि यह कम सुरक्षित नहीं है, यह जवाब देता है। उपरोक्त कोड पूरी तरह से अच्छा यादृच्छिक संख्या लेता है और इसे निम्न संख्याओं की ओर पूर्वाग्रहित करके इसका प्रबंधन करता है। यदि आप अपने उत्तर को यह कहते हुए अस्वीकार कर देते हैं कि यह तेज (लूप को हटाकर) है, लेकिन यह CSPRNG नहीं है तो यह इस समस्या को हल कर देगा। कृपया, क्रिप्टोकरंसी के प्यार के लिए, उपयोगकर्ताओं को बताएं कि इस फ़ंक्शन का आउटपुट पक्षपाती हो सकता है और यह एक समान समाधान नहीं है। पाश सिर्फ आपको परेशान करने के लिए नहीं है।
स्कॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.