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:
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:
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.
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;
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:
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
uniqidist in keiner Weise zufällig. Es ist völlig vorhersehbar. Diese Frage sucht ganz speziell nach pseudozufälligen Zeichenfolgen.
Meagar
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 stringfor($i =0; $i < $length; $i++){
$character = $workArray[rand(0,61)];
$returnString .= $character;}return $returnString;}
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:
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.
$cryptoStrong =true;// can be false
$length =16;// Any length you want
$bytes = openssl_random_pseudo_bytes($length, $cryptoStrong);
$randomString = bin2hex($bytes);
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.
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.
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?
Random::alphanumericString($length)
macht was Sie wollen. Wenn Sie dies selbst erstellen möchten, verwenden Sie keine andere Zufallsquelle als das in PHP integrierterandom_bytes
oderrandom_int
.Antworten:
Erstellen Sie zuerst eine Zeichenfolge mit allen möglichen Zeichen:
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
$characters
Zeichenfolge, um ein zufälliges Zeichen zu erhalten, und hängen Sie es an Ihre Zeichenfolge an:$random_string_length
ist die Länge der zufälligen Zeichenfolge.quelle
mt_rand()
ist ein Ersatz fürrand()
und ist besser.strlen()
jeder Iteration ist nicht gut. Weisen Siestrlen($characters) - 1
eine Variable zu und führen Sie Strlen außerhalb des Zyklus aus. In diesem Fall nicht kritisch, aber es ist nur Mauvais Tonne .Ich mag diese Funktion für den Job
quelle
Generieren Sie mit der Funktion openssl_random_pseudo_bytes eine kryptografisch starke, zufällige (potenziell) 8- stellige Zeichenfolge :
Verfahrensweise:
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.quelle
Einzeilige Lösung:
Sie können den substr-Parameter ändern, um eine andere Länge für Ihre Zeichenfolge festzulegen.
quelle
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.
Mehr sehen:
quelle
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:
quelle
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.
quelle
Vielleicht habe ich hier etwas verpasst, aber hier ist eine Möglichkeit, die Funktion uniqid () zu verwenden .
quelle
uniqid
ist in keiner Weise zufällig. Es ist völlig vorhersehbar. Diese Frage sucht ganz speziell nach pseudozufälligen Zeichenfolgen.Ich habe die folgende Schnellfunktion erstellt, um nur mit der
range()
Funktion herumzuspielen. Es könnte irgendwann jemandem helfen.quelle
quelle
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:
quelle
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 undsubstr()
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.quelle
Das benutze ich:
Sie können die Dokumente für openssl_random_pseudo_bytes hier und die Dokumente für bin2hex hier sehen
quelle
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.
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.
quelle
range('a','z');
1 Zeile:
quelle
Die moderne Art, dies mit dem Typ tip / rand_int zu tun, um echte Zufälligkeit zu erzielen
quelle
Listen Sie zuerst die gewünschten Zeichen auf
Verwenden Sie die Funktion str_shuffle ($ string). Diese Funktion liefert Ihnen eine zufällig gemischte Zeichenfolge.
50 ist die Länge der Zeichenfolge.
quelle
quelle