Zufälligen String mit eigenem Alphabet ohne mt_rand()


Seit PHP Version 5.3.0 gibt es die Funktion openssl_random_pseudo_bytes().
Ich möchte euch nun eine Lösung vorstellen wie man nur mit openssl_random_pseudo_bytes() einen Zufallsstring generieren kann.

    function randomString($length=64, $chars='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz')
    {
        if ($length < 1 || strlen($chars) < 2) {
            return false;
        }

        // Initialize
        $result      = "";
        $fullCharset = "";
        $strong      = false;
        
        // Expand our charset to minimum 255 Chars
        while (strlen($fullCharset) < 255) {
            $fullCharset .= str_shuffle($chars);
        }
        
        // Generate the random bytes
        $randomBytes = openssl_random_pseudo_bytes($length, $strong);
        
        if ($randomBytes && $strong) {
            
            // Map the random bytes to our charset          
            for ($i = 0; $i < $length; $i++) {
                $byteDecimal = hexdec(bin2hex($randomBytes{$i}));
                $result .= $fullCharset{$byteDecimal};
            }

            if (strlen($result) != $length) {
                return false;
            }
            return $result;
        }
        return false;
    }

Natürlich mit einer kurzen Erklärung 🙂 Zunächst erstellen wir den String $fullCharset mit mindestens 255 Zeichen aus eurem Alphabet, in dem wir $chars immer wieder aneinanderhängen. (Zeile 7). Dann generieren wir uns die zufälligen Bytes, openssl_random_pseudo_bytes() erwartet als Parameter die Anzahl der zu generierenden Bytes. Ein Byte hat als Dezimalzahl dargestellt einen Wert zwischen 0 und 255. Einfacher gesagt, generieren wir uns also $length Zahlen in diesem Bereich. Da wir unser Alphabet zuvor auf 255 Zeichen erweitert haben "mappen" wir jetzt jedes zufällig generierte Byte auf die jeweilige Position im String $fullCharset


Archive

No Responses

Leave a reply

*

4 × 2 =