Generieren von (Pseudo) zufälligen alphanumerischen Zeichenfolgen


84

Wie kann ich eine (pseudo) zufällige alphanumerische Zeichenfolge generieren, etwa: 'd79jd8c' in PHP?


Die Lösung ist kurz und einzigartig. Siehe diesen Link stackoverflow.com/a/34467730/4345141
Saud Khan

Die Methode Random::alphanumericString($length)macht was Sie wollen. Wenn Sie dies selbst erstellen möchten, verwenden Sie keine andere Zufallsquelle als das in PHP integrierte random_bytesoder random_int.
Caw

Antworten:


164

Erstellen Sie zuerst eine Zeichenfolge mit allen möglichen Zeichen:

 $characters = 'abcdefghijklmnopqrstuvwxyz0123456789';

Sie können auch range () verwenden , um dies schneller zu tun.

Wählen Sie dann in einer Schleife eine Zufallszahl aus und verwenden Sie sie als Index für die $charactersZeichenfolge, um ein zufälliges Zeichen zu erhalten, und hängen Sie es an Ihre Zeichenfolge an:

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

$random_string_length ist die Länge der zufälligen Zeichenfolge.


9
Diese Implementierung ist auch hilfreich, wenn Sie Zeichen entfernen möchten, die gleich aussehen, z. B. "l" und "1", "O" und "0". Dies lohnt sich beim Generieren neuer Passwörter für Benutzer.
Mark Nold

10
Ich benutze diese Technik auch und entferne alle Vokale, damit ich nicht versehentlich jemandem etwas Unhöfliches für ein Passwort gebe.
Nickf

10
Kleinere Verbesserung: mt_rand()ist ein Ersatz für rand()und ist besser.
Grilse

11
Das Ausführen strlen()jeder Iteration ist nicht gut. Weisen Sie strlen($characters) - 1eine Variable zu und führen Sie Strlen außerhalb des Zyklus aus. In diesem Fall nicht kritisch, aber es ist nur Mauvais Tonne .
Mintobit

6
Erwägen Sie die Verwendung von random_int, wenn Sie einen kryptografisch sicheren Zufall benötigen.
wirklich schön

18

Ich mag diese Funktion für den Job

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

Generieren Sie mit der Funktion openssl_random_pseudo_bytes eine kryptografisch starke, zufällige (potenziell) 8- stellige Zeichenfolge :

echo bin2hex(openssl_random_pseudo_bytes(4));

Verfahrensweise:

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

Aktualisieren:

PHP7 führte die random_x()Funktionen ein, die noch besser sein sollten. Wenn Sie aus PHP 5.X kommen, verwenden Sie eine hervorragende paragonie / random_compat- Bibliothek, die eine Polyfüllung für random_bytes () und random_int () aus PHP 7 darstellt.

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

7

Einzeilige Lösung:

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

Sie können den substr-Parameter ändern, um eine andere Länge für Ihre Zeichenfolge festzulegen.


4

Verwenden Sie die ASCII-Tabelle , um einen Buchstabenbereich auszuwählen, wobei: $ range_start, $ range_end ein Wert aus der Dezimalspalte in der ASCII-Tabelle ist.

Ich finde, dass diese Methode besser ist als die beschriebene Methode, bei der der Zeichenbereich speziell in einer anderen Zeichenfolge definiert ist.

// 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;

Mehr sehen:


1
Dies ist schön, obwohl nicht alphanumerische Zeichen in diesen ACSII-Bereich fallen.
Bower

4

Ich weiß, dass es ein alter Beitrag ist, aber ich möchte mit einer Klasse beitragen, die ich basierend auf Jeremy Rutens Antwort erstellt und mit Vorschlägen in Kommentaren verbessert habe:

    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

Einfache Leute ... aber denken Sie daran, dass jedes Byte zufällig zwischen 0 und 255 liegt, was für eine zufällige Zeichenfolge in Ordnung ist. Denken Sie auch daran, dass Sie zwei Zeichen für jedes Byte haben.

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

Mit Abstand die beste Antwort und der kürzeste Code! Dies sollte mehr positive
Stimmen


2

Ich habe die folgende Schnellfunktion erstellt, um nur mit der range()Funktion herumzuspielen. Es könnte irgendwann jemandem helfen.

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;
}

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

Sie können den folgenden Code verwenden, der aus diesem Artikel kopiert wurde . Es ähnelt vorhandenen Funktionen, außer dass Sie die Anzahl der Sonderzeichen erzwingen können:

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

1

Wenn Sie dies auf sehr einfache Weise tun möchten, können Sie sich auf vorhandene PHP-Funktionen stützen. Dies ist der Code, den ich benutze:

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

time()gibt Ihnen die aktuelle Zeit in Sekunden seit der Epoche an, sha1()verschlüsselt sie in eine Zeichenfolge von 0-9a-f und substr()lässt Sie eine Länge auswählen. Sie müssen nicht bei Zeichen 0 beginnen, und was auch immer der Unterschied zwischen den beiden Zahlen ist, ist die Länge der Zeichenfolge.



0

Jeremys Antwort ist großartig. Wenn Sie wie ich nicht sicher sind, wie Sie range () implementieren sollen, können Sie meine Version mit range () anzeigen.

<?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;
?>

Dies macht genau das Gleiche wie bei Jeremy, verwendet jedoch zusammengeführte Arrays, in denen er einen String verwendet, und count (), in dem er strlen () verwendet.


2
es muss seinrange('a','z');
Mehdi Karamosly

0

1 Zeile:

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

0

Die moderne Art, dies mit dem Typ tip / rand_int zu tun, um echte Zufälligkeit zu erzielen

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

Listen Sie zuerst die gewünschten Zeichen auf

$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

Verwenden Sie die Funktion str_shuffle ($ string). Diese Funktion liefert Ihnen eine zufällig gemischte Zeichenfolge.

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

50 ist die Länge der Zeichenfolge.


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;
}

Sie haben eine unterschiedliche Anzahl von Zeichen in Klein- und Großbuchstaben. Und hat dieser Code Vorteile gegenüber allen anderen hier bereits veröffentlichten Varianten?
Magras
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.