Generieren von (Pseudo) zufälligen alphanumerischen Zeichenfolgen

84

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

UnkwnTech
quelle
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.

Jeremy Ruten
quelle
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);
Azerafati
quelle
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));
}
emix
quelle
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.

Marco Panichi
quelle
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:

Daniel
quelle
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;

      }

    }
diegoiglesias
quelle
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
David Young
quelle
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;
}
Peter
quelle
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();
Molla Rasel
quelle
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);
}
Salman A.
quelle
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.

DiMono
quelle
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.

Josh Smith
quelle
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;
HausO
quelle
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;
}
Lyrixx
quelle
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.

Shravan M.
quelle
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;
}
Александр Маринов
quelle
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