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:|