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.