Erittäin satunnainen string

qin 30.08.05 13:29

Kaikkien aikojen tehokkain satunnais-string-funktio ProRND nyt open sourcena! (Ennen jopa tuhansien eurojen lisenssimaksut)

 Tekstiversio  Arvo: -7 (15 ääntä)  Äänestä: +  -
function proRND($len = 8) {
        $hash = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','w','x','y','z',
                                  'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','W','X','Y','Z',
                                  '1','2','3','4','5','6','7','8','9','0');
        for ($i = 0; $i < 16; $i++) {
                $rand = rand(0, count($hash));
                $generated_str .= $hash[$rand];
        }
        $ip = $_SERVER[REMOTE_ADDR];
        $ip = explode('.', $ip);
        foreach ($ip as $ipnum) {
                $ip_str .= dechex($ipnum * rand(1, 1000));
        }
        $port_str = $_SERVER[REMOTE_PORT] * rand(1, 100);
        $agent_str = strrev(md5($_SERVER[HTTP_USER_AGENT]));
        for ($i = 0; $i < 10; $i++) {
                list($usec, $sec) = explode(' ', microtime());
                $num_str .= rand(0, (float) $sec + ((float) $usec * 100000));
        }
        $path_str = md5($_SERVER[PATH]);
        $server_str = md5($_SERVER[SERVER_SOFTWARE]);
        $str_orig = $generated_str.$ip_str.$port_str.$agent_str.$num_str.$path_str.$server_str;
        for ($i = 0; $i < strlen($str_orig); $i++) {
                $string[] = $str_orig[$i];
        }
        shuffle($string);
        foreach ($string as $temp) {
                $str .= $temp;
        }
        $str = substr($str, 0, $len);
        return trim($str);
}
 

phadej 15:43 30.8.05 
voi sitä tehdä vaikeallakin tavalla...
qin 16:34 30.8.05 
phadej kirjoitti:
voi sitä tehdä vaikeallakin tavalla...

Ja samalla luotettavalla, toisin kuin esim. timestamp-seediin perustuvat randomizet.
editoitu: 20:54 30.8.05
Kryil 20:53 30.8.05 
Aivan järkyttävää ajanhukkaa! Miksi sitä täytyy noin monta kertaa kääntää ja vääntää?
On teknisesti mahdotonta, että kahta scriptiä suoritettaisiin täysin samanaikaisesti, joten jo pelkästään yhdistämällä microtimen, ip:n ja useragentin saa aikaan stringin, jota ei varmasti tule toista samalla hetkellä. Siihen kun lisää vielä vaikka unixtimen niin ei tule toista koskaan.

Mahtaa olla pettyneitä asiakkaita, jos tuosta ovat "tuhansia euroja" maksaneet...
_Pete_ 09:13 31.8.05 
Kryil kirjoitti:
Aivan järkyttävää ajanhukkaa! Miksi sitä täytyy noin monta kertaa kääntää ja vääntää?
On teknisesti mahdotonta, että kahta scriptiä suoritettaisiin täysin samanaikaisesti, joten jo pelkästään yhdistämällä microtimen, ip:n ja useragentin saa aikaan stringin, jota ei varmasti tule toista samalla hetkellä. Siihen kun lisää vielä vaikka unixtimen niin ei tule toista koskaan.

Mahtaa olla pettyneitä asiakkaita, jos tuosta ovat "tuhansia euroja" maksaneet...


Eikös teknisesti ole mahdollista, että monta cpu:ta omaavassa koneessa scriptiä voidaan ainakin periaatteessa suorittaa
täysin samaan aikaan....

tino 10:58 31.8.05 
Suunnilleen yhtä mahdollista kuin se, että yo. funktio palauttaa kaksi samaa tulosta. Periaatteessa niin voi käydä mutta en menettäisi yöuniani sen vuoksi.
Kryil 21:24 31.8.05 
_Pete_ kirjoitti:
Eikös teknisesti ole mahdollista, että monta cpu:ta omaavassa koneessa scriptiä voidaan ainakin periaatteessa suorittaa
täysin samaan aikaan....

Jos tuon mahdollisuus ahdistaa, niin lisää vielä remote port siihen. Ja montaa ip:tä palvelevassa serverissä ehkä vielä se paikallinen ip. Vieläkö on mahdollisuuksia samaan tulokseen?
editoitu: 21:39 31.8.05
Kryil 21:38 31.8.05 
Ja jospa nyt vielä analysoin hieman tuota scriptiä, ettei ihan aiheesta eksytä.


PHP
$port_str = $_SERVER[REMOTE_PORT] * rand(1, 100);
Kuten edellä mainitsin, remote port on aina eri samanaikaisille scripteille. Eikös tämä lisää todennäköisyyttä, että "samaan aikaan" suoritettavat scriptit päätyisivät samaan tulokseen?

PHP
$agent_str = strrev(md5($_SERVER[HTTP_USER_AGENT]));
Miksi strrev? Se vain tuhlaa aikaa. Md5 summa on erilainen sekä alusta, että lopusta, vaikka muutos olisikin vain yksi merkki.

PHP
for ($i = 0; $i < 10; $i++) {
       list($usec, $sec) = explode(' ', microtime());
       $num_str .= rand(0, (float) $sec + ((float) $usec * 100000));
}

Samaa kuin edellä, eikös se rand() vain lisää todennäköisyyttä samaan tulokseen?

PHP
$path_str = md5($_SERVER[PATH]);
$server_str = md5($_SERVER[SERVER_SOFTWARE]);

Ja nämähän ovat aina samat. Mitä hyötyä?

PHP
for ($i = 0; $i < strlen($str_orig); $i++) {
       $string[] = $str_orig[$i];
}
shuffle($string);
foreach ($string as $temp) {
      $str .= $temp;
}

Tutustu ihmeessä funktioon str_shuffle()

PHP
$str = substr($str, 0, $len);
return trim($str);

Jos halutaan tasan arvon x mittaisia hasheja, niin onko silloin hyvä, jos siinä on jotain trimmattavaa?

Ihmetyttää edelleen tuo mainitsemasi tuhansien eurojen lisenssi. Oletko oikeasti onnistunut myymään tämän jollekulle sellaiseen hintaan?

EDIT: tagit kuntoon.
editoitu: 15:39 1.9.05
chiman 15:34 1.9.05 
Kryil kirjoitti:
Ihmetyttää edelleen tuo mainitsemasi tuhansien eurojen lisenssi. Oletko oikeasti onnistunut myymään tämän jollekulle sellaiseen hintaan?

Ironia - Koomisuuden laji, epäsuora iva, joka esittää puutteet ja viat avuina, arvottoman arvokkaana, moitteen kehuna jne.

Itse koodista sen verran, että ironia sopii siihen oikein hyvin. Tykillä kärpästä jne.
Kiitämme: siistit sisennykset.
Moitimme: arrayn määrittelyrivit ovat liian leveitä.