globe: Zufällige Passwörter generieren mit md5?

Beitrag lesen

n'abend,

mt_srand ((double)microtime()*1000000);  ## ? ist das noch notwendig?

laut Doku nicht: »Hinweis: Seit PHP 4.2.0 besteht keine Notwendigkeit mehr, den Zufallsgenerator für Zahlen mit srand() oder mt_srand() zu füttern, das geschieht nun automatisch.«

$zeichen="abcdefghijklmnopqrstuvwxyzäöüßABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ0123456789-+_&~.,!".$extra;

[...]

$zufall.=substr($zeichen,mt_rand(0,strlen($zeichen)-1),1);

Ich hab das spaßeshalber mal mit einer rein auf array-Funktionen setzenden Lösung verglichen, die etwa das gleiche ermöglich wie deine String-basierte. Das (etwas überraschende) Resultat:

randomString() took 0.282233953476 seconds and generated 10000 unique strings in 10000 runs
get_random_str() took 0.887847900391 seconds and generated 10000 unique strings in 10000 runs

<?php  
  
/**  
 * Generiere zufällige (alphanumerische) Zeichenfolge aus den Bereichen a-z, A-Z, 0-9  
 * @param integer $min minimale Anzahl an Zeichen  
 * @param integer $max maximale Anzahl an Zeichen (optional)  
 * @param array $additionalCharacters zusätzliche  
 * @return string zufällige Zeichenkette  
 */  
function randomString( $min, $max=null, $additionalCharacters=array() )  
{  
  // baue alphanumerisches character-array nur einmal für alle folgenden aufrufe  
  static $characters = null;  
  if( $characters === null )  
  {  
    $characters = array_merge(  
      range( 'a', 'z' ), // kleinbuchstaben  
      range( 'A', 'Z' ), // grossbuchstaben  
      range( 0, 9 ) // zahlen  
    );  
  }  
	  
  // füge zusätzliche zeichen ein  
  $c = $additionalCharacters ? array_merge( $characters, $additionalCharacters ) : $characters;  
	  
  // ermittle länge des zufallstrings  
  $length = is_numeric($max) && $min != $max ? mt_rand( $min, $max ) : $min;  
  
  // ermittle zufällige indexe aus dem character-array  
  $indexes = array_rand( $c, $length );  
  
  // ziehe zeichen zu jeweiligem index aus dem character-array  
  $t = array();  
  foreach( $indexes as $i )  
    $t[] = $c[ $i ];  
  
  // füge einzelne zeichen zu einem string zusammen  
  return join( $t );  
}  
  
echo '<pre>';  
  
$runs = 10000;  
$start = microtime(true);  
  
$t = array();  
for( $i=0; $i < $runs; $i++ )  
	$t[] = randomString( 10 );  
  
$end = microtime(true);  
echo 'randomString() took ', $end - $start, ' seconds and generated ', count( array_unique( $t ) ), ' unique strings in ', $runs, ' runs', "\n";  
  
  
function get_random_str($lenmin,$lenmax,$extra='')  
{  
  mt_srand ((double)microtime()*1000000);  ## ? ist das noch notwendig?  
  $anzahl = mt_rand($lenmin,$lenmax);  
  
  $zeichen="abcdefghijklmnopqrstuvwxyzäöüßABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ0123456789-+_&~.,!".$extra;  
  
  $zufall="";  
  
  $i=0;  
  while($i<=$anzahl)  
  {  
    $zufall.=substr($zeichen,mt_rand(0,strlen($zeichen)-1),1);  
    $i++;  
  }  
  return $zufall;  
}  
  
$start = microtime(true);  
  
$t = array();  
for( $i=0; $i < $runs; $i++ )  
  $t[] = get_random_str( 10, 10 );  
  
$end = microtime(true);  
echo 'get_random_str() took ', $end - $start, ' seconds and generated ', count( array_unique( $t ) ), ' unique strings in ', $runs, ' runs', "\n";  
  
echo '</pre>';  
  
?>

Wenn man den gleichen Zeichenvorrat haben möchte (ohne ihn fest einzuprogrammieren), sieht das auch schon wieder anders aus:

randomString() took 0.518404960632 seconds and generated 10000 unique strings in 10000 runs
get_random_str() took 0.823408842087 seconds and generated 10000 unique strings in 10000 runs

Bei folgendem Aufruf:
randomString( 10, null, array( 'ä','ö','ü','ß','Ä','Ö','Ü','-','+','_','&','~','.',',','!' ) );

weiterhin schönen abend...

--
#selfhtml hat ein Forum?
sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|