Perfomance Problem

  • Themenstarter Themenstarter i125
  • Beginndatum Beginndatum
I

i125

Hallo zusammen,

ich hab ein kleines Perfomance Problem:

Ich soll einen Keygenerator schreiben, der mir 100.000 Keys auswirft.

Rahmenbedingungen:
6 stelliger Code
3 Zahlen (0-9)
3 Buchstaben (Groß und Kleinschreibung erlaubt.)

Laufzeiten:
bei 100 ca. 1sec..
bei 1000 ca. 3sec.
bei 10000 ca. 15sec.
bei 100000 -> geht nimmer, trotz executiontime von 60min (3600)!

Habt ihr einen Ansatz / Verbessungsvorschlag für mich?

Danke und viele Grüsse Alexander.

Der Code:

PHP:
<?php

settype($template, "string");
settype($templatealpha, "string");
$templatealpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMOPQRSTUVWXYZ";
$template = "1234567890";

function makedecimal($length){
  global $template;
  settype($length, "integer");
  settype($rndstring, "string");
  settype($a, "integer");
  settype($b, "integer");
  for ($a = 0; $a <= $length; $a++){
    $b = rand(0, strlen($template) - 1);
    $rndstring .= $template[$b];
  }
  return $rndstring;
}

function makealpha($length){
  global $templatealpha;
  settype($length, "integer");
  settype($rndstring, "string");
  settype($a, "integer");
  settype($b, "integer");
  for ($a = 0; $a <= $length; $a++){
    $b = rand(0, strlen($templatealpha) - 1);
    $rndstring .= $templatealpha[$b];
  }
  return $rndstring;
}

$keys = array();
$countkeys = 10000s;

function makeakey(){
 $length = 0;
 $output = makedecimal($length);
 $output = $output.makealpha($length);
 $output = $output.makedecimal($length);
 $output = $output.makealpha($length);
 $output = $output.makedecimal($length);
 $output = $output.makealpha($length);
 return $output;
}

while (count($keys)<=$countkeys){
 $return = makeakey();
 if(!in_array($return,$keys))
 {
  array_push($keys,$return);
 }
}

for($s=0;$s<count($keys);$s++)
{
 echo $keys[$s]."<br>";
}
?>
 
Hallo Gumbo,

nein, es müssen halt nur 3 Zahl und 3 Buchstaben drinn sein, der Wert darf nicht mehrfach vorkommen.

Hast du ne Idee?
 
100000 in einem Array sind ziemlich viele. Dementsprechend wird es wohl ziemlich lang dauern, bis er überprüft, ob der Key schon mal vorgekommen ist. Außerdem kommt noch dazu, dass das umso häufiger vorkommt, je mehr Keys du hast.
Wie schauts denn dazwischen aus - schafft er zB. 30000?
Edit: Noch was. Du rufst die Funktionen immer mit dem Parameter $length=0 auf - also gibt er eine Ziffer bzw. einen Buchstaben zurück. Wenn du nicht mehr brauchst, würd ich die ganzen Schleifen in den Funktionen (die ja ohnehin nur von 0 bis 0 zählen) rausnehmen.
 
Hm noch ein Verbesserungsvorschlag. Wenn du, wie Gumbo gefragt hat, keine besondere Form brauchst, dann ruf die Buchstaben - und Zahlenfunktion doch nicht abwechselnd auf, sondern je einmal und dafür mit dem Parameter 3.
 
Hier mein Vorschlag:
PHP:
function randString($length)
{
	$chars = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMOPQRSTUVWXYZ';
	$strlen = strlen($chars);
	$str = '';
	for( $i=0; $i<$length; $i++ ) {
		$str .= $chars{rand(0, $strlen - 1)};
	}
	return $str;
}

$array = array();
$i = 0;
while( $i<100000 ) {
	$randString = randString(6);
	if( !isset($array[$randString]) ) {
		$array[$randString] = $randString;
		$i++;
	}
}
Damit ist zwar die Anzahl der Zahlen und Buchstaben nicht gewährleistet, dafür ist es aber sehr viel schneller. Ein Durchlauf von 100000 Wiederholungen benötigt etwa 5 Sekunden.
 
Ist das eine Hausaufgabe oder warum kommt diese Frage erneut?

Muss der Schlüssel etwas bestimmtes erfüllen?
Sicherheit?
Ungeordneter Schlüssel?

@Gumbo,
genau an deinen Vorschlag dachte ich auch, allerdings nur mit dem unterschied, das ganze in Zahlen und Buchstaben aufzuteilen. Danach die 3 Zahlen und 3 Buchstaben zusammenführen und im Array ablegen.
Brauch ebenfalls nur 3 - 6 Sekunden.
 
Zuletzt bearbeitet:
Nein, keine Hausaufgabe, der Quark soll heut bis um 16 Uhr fertig sein. Ich bin kurz am verzweifeln.

Jemand ne idee--- hillllllffffeeeeeeeee....
 
Also wenn Gumbo's Lösung nicht deinen Anforderungen entspricht, muss der Schlüssel geordnet sein - richtig?

Wenn er also nach Zahlen (also zuerst die 3 Zahlen) und Buchstaben (nach den Zahlen) geordnet sein soll, machst du einfach den Lösungsvorschlag wie von mir erwähnt.
 
Zurück