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