Na początku swoją propozycję przedstwaił MajareQ:
KOD
function losuj_haslo_mq($dlugosc) {
$dozwolone_znaki = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$dozwolone_znaki .= "abcdefghijklmnopqrstuvwxyz";
$dozwolone_znaki .= "0123456789._-";
$haslo = '';
$passwordd = strlen($dozwolone_znaki);
mt_srand((double) microtime() * 1000000);
for($i=0; $i<$dlugosc; $i++) {
$password = mt_rand(0, $passwordd);
$haslo .= substr($dozwolone_znaki, $password, 1);
}
return $haslo;
}
Następny był Karer, który zaproponował zmodyfikowaną wersję funkcji MajareQ'a:
KOD
function losuj_haslo_karer($dlugosc) {
$dozwolone_znaki = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$dozwolone_znaki .= 'abcdefghijklmnopqrstuvwxyz';
$dozwolone_znaki .= '0123456789._-';
$haslo = '';
$d = strlen($dozwolone_znaki);
for($i=0; $i<$dlugosc; $i++) {
$los = mt_rand(0, $d);
$haslo .= $dozwolone_znaki{$los};
}
return $haslo;
}
Potem Daniel1302 rzucił coś od siebie:
KOD
function losuj_haslo_daniel1302($dlugosc)
{
$uId = uniqid();
$passHash = md5($uId);
$pass = substr($passHash, 0, $dlugosc);
return $pass;
}
Na końcu dostaliśmy propozycję funkcji od Veru...
KOD
function losuj_haslo_veru($dlugosc) {
$chars = "abcdefghijklmnoprstuwxyz0123456789";
for ($i = 0; $i < $dlugosc; $pass .= $chars{mt_rand(0, strlen($chars)-1)}, $i++);
return $pass;
}
...i Stefanka93:
KOD
function losuj_haslo_stefanek($dlugosc)
{
for ($i = 0, $haslo = ''; $i < $dlugosc; ++$i)
$haslo .= chr(mt_rand(ord('A'), ord('Z')));
return $haslo;
}
Szybkość
Postanowiłem przeprowadzić testy szybkościowe podanych funkcji. Użyłem takiego kodu:
KOD
<?
function start($s) {
global $start;
echo '=== '.$s." === ";
$start = microtime();
}
function finish() {
global $start;
$end = microtime();
$start = split(' ',$start);
$end = split(' ',$end);
$start = $start[1] + $start[0];
$end = $end[1] + $end[0];
$total = ($end - $start);
echo 'Execution Time: '.$total." === ";
unset($start);
return $total;
}
function losuj_haslo_mq($dlugosc) {
$dozwolone_znaki = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$dozwolone_znaki .= "abcdefghijklmnopqrstuvwxyz";
$dozwolone_znaki .= "0123456789._-";
$haslo = '';
$passwordd = strlen($dozwolone_znaki);
mt_srand((double) microtime() * 1000000);
for($i=0; $i<$dlugosc; $i++) {
$password = mt_rand(0, $passwordd);
$haslo .= substr($dozwolone_znaki, $password, 1);
}
return $haslo;
}
function losuj_haslo_karer($dlugosc) {
$dozwolone_znaki = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$dozwolone_znaki .= 'abcdefghijklmnopqrstuvwxyz';
$dozwolone_znaki .= '0123456789._-';
$haslo = '';
$d = strlen($dozwolone_znaki);
for($i=0; $i<$dlugosc; $i++) {
$los = mt_rand(0, $d);
$haslo .= $dozwolone_znaki{$los};
}
return $haslo;
}
function losuj_haslo_daniel1302($dlugosc)
{
$uId = uniqid();
$passHash = md5($uId);
$pass = substr($passHash, 0, $dlugosc);
return $pass;
}
function losuj_haslo_veru($dlugosc) {
$chars = "abcdefghijklmnoprstuwxyz0123456789";
for ($i = 0; $i < $dlugosc; $pass .= $chars{mt_rand(0, strlen($chars)-1)}, $i++);
return $pass;
}
function losuj_haslo_stefanek($dlugosc)
{
for ($i = 0, $haslo = ''; $i < $dlugosc; ++$i)
$haslo .= chr(mt_rand(ord('A'), ord('Z')));
return $haslo;
}
function licz_srednia($a, $n) {
$wynik = $max = 0;
$min = 1000; //;]
foreach($a as $i) {
if($i > $max) $max = $i;
if($i < $min) $min = $i;
$wynik += $i;
}
$wynik /= count($a);
echo '=== Wyniki dla '.$n." === ";
echo 'Sredni wynik: '.$wynik." ";
echo 'Najdłuższe wykonanie: '.$max." ";
echo 'Najkrótsze wykonanie: '.$min." ";
}
$wynikiMQ = array();
$wynikiKarer = array();
$wynikiDaniel1302 = array();
$wynikiVeru = array();
$wynikiStefanek = array();
$dlugoscHasla = 32;
$iloscHasel = 10000;
$iloscTestow = 5;
for($x=0;$x<$iloscTestow;$x++) {
start("Funkcja losująca hasło by MQ");
for($i=0;$i<$iloscHasel;$i++) { losuj_haslo_mq($dlugoscHasla); }
$wynikiMQ[] = finish();
start("Funkcja losująca hasło MQ zmodyfikowana przez Karer'a");
for($i=0;$i<$iloscHasel;$i++) { losuj_haslo_karer($dlugoscHasla); }
$wynikiKarer[] = finish();
start("Funkcja losująca hasło by Daniel1302");
for($i=0;$i<$iloscHasel;$i++) { losuj_haslo_daniel1302($dlugoscHasla); }
$wynikiDaniel1302[] = finish();
start("Funkcja losująca hasło by Veru");
for($i=0;$i<$iloscHasel;$i++) { losuj_haslo_veru($dlugoscHasla); }
$wynikiVeru[] = finish();
start("Funkcja losująca hasło by Stefanek93");
for($i=0;$i<$iloscHasel;$i++) { losuj_haslo_stefanek($dlugoscHasla); }
$wynikiStefanek[] = finish();
}
licz_srednia($wynikiMQ, "Emku");
licz_srednia($wynikiKarer, "Karer");
licz_srednia($wynikiDaniel1302, "Daniel1302");
licz_srednia($wynikiVeru, "Veru");
licz_srednia($wynikiStefanek, "Stefanek93");
echo " Wyniki dla: ";
echo ' $dlugoscHasla = '.$dlugoscHasla." ";
echo ' $iloscHasel = '.$iloscHasel." ";
echo ' $iloscTestow = '.$iloscTestow." ";
?>/code][b]//Notatka Redaktorska: Wywalić do osobnego pliku.[/b]
Powyższy skrypt był odpalany w konsoli w KDE (Konsole) poprzez PHP CLI na systemie operacyjnym GNU/Linux, dystrybucja Debian Lenny 5.0 Stable. Użyta wersja PHP to:
[code]PHP 5.2.6-1+lenny2 with Suhosin-Patch 0.9.6.2 (cli) (built: Jan 26 2009 22:41:04)
Użyta komenda:
KOD
/usr/bin/php passwords.php
Oto wyniki:
KOD
=== Wyniki dla Emku ===
Sredni wynik: 0,89374756813
Najdłuższe wykonanie: 0,903063058853
Najkrótsze wykonanie: 0,883421897888
=== Wyniki dla Karer ===
Sredni wynik: 0,539475011826
Najdłuższe wykonanie: 0,543428182602
Najkrótsze wykonanie: 0,536156892776
=== Wyniki dla Daniel1302 ===
Sredni wynik: 0,179503774643
Najdłuższe wykonanie: 0,184824943542
Najkrótsze wykonanie: 0,175233125687
=== Wyniki dla Veru ===
Sredni wynik: 0,678248023987
Najdłuższe wykonanie: 0,686470985413
Najkrótsze wykonanie: 0,67005109787
=== Wyniki dla Stefanek93 ===
Sredni wynik: 0,912500572205
Najdłuższe wykonanie: 0,922179937363
Najkrótsze wykonanie: 0,906667947769
Wyniki dla:
$dlugoscHasla = 32
$iloscHasel = 10000
$iloscTestow = 5
Zmienne wymienione na końcu oznaczają kolejno: Długość generowanego hasła, Ilość generowanych pod rząd haseł, ilość wykonanych testów [z których brana jest średnia]
Werdykt
Najszybszą funkcją służącą do generowania losowego hasła jest funkcja Daniela1302, tuż za nim stoi funkcja Karer'a, prawie na końcu funkcja Veru, a potem niemal że Ex Equo funkcje Stefanka93, i MajareQ'a.