Come usare / dev / urandom con PHP per get CS numbers casuali

Ho bisogno di creare interi casuali tra i valori di 0 e 10.000.000, e avrò bisogno di diversi milioni di tali numbers. I numbers devono essere il più vicino ansible a un CSPRNG in quanto, ad esempio, qualcuno dovrebbe leggere, quindi 1 milione su 2 milioni di numbers tali da non riuscire a calcolare i restanti 1 milione di numbers.

Dopo alcune ricerche sono giunto alla conclusione che con gli strumenti che ho a disposizione, (Unix / PHP) usando / dev / urandom sarà la mia migliore scommessa.

Mi sono imbattuto in questa soluzione:

// equiv to rand, mt_rand // returns int in *closed* interval [$min,$max] function devurandom_rand($min = 0, $max = 0x7FFFFFFF) { $diff = $max - $min; if ($diff < 0 || $diff > 0x7FFFFFFF) { throw new RuntimeException("Bad range"); } $bytes = mcrypt_create_iv(4, MCRYPT_DEV_URANDOM); if ($bytes === false || strlen($bytes) != 4) { throw new RuntimeException("Unable to get 4 bytes"); } $ary = unpack("Nint", $bytes); $val = $ary['int'] & 0x7FFFFFFF; // 32-bit safe $fp = (float) $val / 2147483647.0; // convert to [0,1] return round($fp * $diff) + $min; } 

Fonte: https://codeascraft.com/2012/07/19/better-random-numbers-in-php-using-devurandom/

Dato che ho bisogno di creare una grande quantità di numbers casuali, sarei migliore piping / dev / urandom su un file (s), e quindi leggere 3 byte (2 ^ 24 = 16 milioni) alla volta e convertire in numero integer?

È una soluzione adatta alle mie esigenze?

Quando esce PHP 7, ha una nuova function chiamata random_int() che serve a questo scopo.

Se hai bisogno di questo oggi (cioè in un progetto PHP 5), controlla random_compat .

Per lo less, guarda come random_int() è implementato in random_compat. Tra le altre ragioni, funziona ancora per intervalli superiori a PHP_INT_MAX . (Sì, usa /dev/urandom .)

Demo: http://3v4l.org/VJGCb