17 Stimmen

Generator für zufällige lange Hex-Zeichenfolgen in PHP

Ich habe einen Generator für Zeichenketten geschrieben, aber ich weiß nicht, wie ich eine Zufallshex Zeichenkette mit einer Länge von z. B. 100 Ziffern zum Einfügen in eine Datenbank. Alle diese Zeichenketten müssen gleich lang sein.

Wie kann ich zufällige Hex-Zeichenfolgen erzeugen?

42voto

danorton Punkte 11509

Ab PHP 5.3 mit OpenSSL-Erweiterung:

function getRandomHex($num_bytes=4) {
  return bin2hex(openssl_random_pseudo_bytes($num_bytes));
}

Für Ihr Beispiel mit 100 Ziffern:

$str = getRandomHex(50);

6voto

Marcin Orlowski Punkte 69097

Dies ist zwar eine Antwort auf die Frage von OP, aber wenn Sie nach etwas anderem suchen zufällig dann ist die Antwort von @danorton vielleicht besser geeignet.


Zum Beispiel so:

$val = '';
for( $i=0; $i<100; $i++ ) {
   $val .= chr(rand(65, 90));
}

65 ist A und 90 ist Z . wenn Sie keine "magischen Zahlen" mögen, ist dieses Formular vielleicht besser lesbar:

$val = '';
for( $i=0; $i<100; $i++ ) {
   $val .= chr(rand(ord('A'), ord('Z')));
}

Ich würde ord() eine Variable und verschieben sie aus Leistungsgründen aus der Schleife heraus:

$A = ord('A');
$Z = ord('Z');
$val = '';
for( $i=0; $i<100; $i++ ) {
   $val .= chr(rand($A, $Z));
}

Oder Sie könnten die Ausgabe von sha1() s (drei davon) und auf 100 Zeichen gekürzt. Oder verwenden Sie md5() stattdessen (aber ich würde mich an sha1() ).

EDIT sha1() gibt eine 40 Zeichen lange Zeichenkette aus, md5() 32 Zeichen lang. Wenn Sie also nicht Zeichen für Zeichen kleben wollen (wie in der Schleife, die ich oben angegeben habe), versuchen Sie diese Funktion

function getId($val_length) {
    $result = '';
    $module_length = 40;   // we use sha1, so module is 40 chars
    $steps = round(($val_length/$module_length) + 0.5);

    for( $i=0; $i<$steps; $i++ ) {
      $result .= sha1(uniqid() . md5(rand());
    }

    return substr($result, 0, $val_length);
}

wobei das Funktionsargument die Länge der zurückzugebenden Zeichenkette ist. Aufruf getId(100);

5voto

Dmitriy Sintsov Punkte 3403
$randHexStr = implode( array_map( function() { return dechex( mt_rand( 0, 15 ) ); }, array_fill( 0, $strlen, null ) ) );

wobei $strlen die Länge der zufälligen Hex-Zeichenkette ist.

4voto

Bernhard D Punkte 41

Ab php7 sollten Sie die Funktion random_bytes :

function getRandomHex($num_bytes=4) {
  return bin2hex(random_bytes($num_bytes));
}

1voto

Yash Savalia Punkte 11

Liner Technik zu tun, aber es ist etwas kompliziert und hart kodiert in Bezug auf die Länge der Zeichenfolge.

$rand4 = substr(sha1(rand(0,getrandmax())),rand(0,24),16);

in dem Sie die letzte Variable der Funktion ändern müssen (die ich auf 16 gesetzt habe), wenn Sie die Länge der Ausgabezeichenfolge ändern möchten, und eine weitere Sache gibt es eine rand(0,24), in der die Zahl 24 entsprechend der dritten Variable geändert wird, es sollte nicht mehr als 40-dritte Variable sein...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X