2014-10-07 14 views
5

Ieri ho sentito una conversazione su rand() e mt_rand(), un collega ha detto che entrambi sono prevedibili e dovresti usare diverse funzioni? Mi stavo chiedendo, lo so che rand() è prevedibile in qualche modo, e dopo qualche ricerca su google. Anche mt_rand() sembra prevedibile se ho letto correttamente.è mt_rand() più sicuro di rand()

Per questo ho scritto un piccolo pezzo di codice, che crea un'immagine:

<?php 
header("Content-type: image/png"); 
$im = imagecreatetruecolor(512, 512) or die("Cannot Initialize new GD image stream"); 
$white = imagecolorallocate($im, 255, 255, 255); 
$black = imagecolorallocate($im, 0, 0, 0); 
for ($y = 0; $y < 512; $y++) { 
    for ($x = 0; $x < 512; $x++) { 
     if (rand(0, 1)) { 
      imagesetpixel($im, $x, $y, $white); 
     } 
     else{ 
      imagesetpixel($im, $x, $y, $black); 
     } 
    } 
} 
imagepng($im); imagedestroy($im); 

?> 

questo uscite di codice di questa immagine, come si può vedere che ha un qualche tipo di modello: rand() image

mentre la funzione mt_rand() mi ha dato questo output: mt_rand() image

ora la mia domanda è, è mt_rand() davvero così prevedibile, sembra pret casuale a me rispetto alla funzione rand().

+0

http://stackoverflow.com/questions/7808021/whats-the-disadvantage-of-mt-rand –

+0

Cosa intendi con * secure * in questo caso? Intendi nel senso che il valore non può essere previsto? –

+1

Questo metodo è molto meglio che stampare numeri casuali 10000 volte e contarli. –

risposta

7

Direttamente dal the docs:

Questa funzione non genera valori crittograficamente sicuro, e non deve essere utilizzato per scopi di crittografia. Se hai bisogno di un valore crittograficamente sicuro, considera l'uso di openssl_random_pseudo_bytes().

mt_rand genera meglio numeri casuali che rand, e molto più veloce. Ma questo non lo rende "sicuro" nel senso che dovrebbe essere usato per la crittografia. Se è abbastanza sicuro per la tua applicazione è piuttosto soggettivo.

+1

Stavo per pubblicare la stessa cosa. Non ho idea di chi abbia provato questo o perché. – GordonM

+0

Per "sicuro" non sappiamo se l'utente significhi crittografia. –

+0

@SpencerWieczorek No, non lo facciamo. – meagar

Problemi correlati