Jaka funkcja do generowania hasła?, Porównanie kilku propozycji użytkowników naszego forum.

Maciej Piwowski
05.09.2015

Zebrał i przetestował: Informatic Kody źródłowe autorstwa: MajareQ, Karer, Daniel1302, Veru, Stefanek93.

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.

 
Zgłoś swój pomysł na artykuł

Więcej w tym dziale Zobacz wszystkie