rfc:improve_predictable_prng_random

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
rfc:improve_predictable_prng_random [2017/02/03 04:34] – Fix function signature yohgakirfc:improve_predictable_prng_random [2018/03/01 23:13] (current) – RFC is Under Discussion carusogabriel
Line 3: Line 3:
   * Date: 2017-02-01   * Date: 2017-02-01
   * Author: Yasuo Ohgaki <yohgaki@ohgaki.net>   * Author: Yasuo Ohgaki <yohgaki@ohgaki.net>
-  * Status: Draft+  * Status: Under Discussion
   * First Published at: http://wiki.php.net/rfc/improve_predictable_prng_random   * First Published at: http://wiki.php.net/rfc/improve_predictable_prng_random
  
Line 105: Line 105:
     public function getBytes(int $length); // Raw bytes     public function getBytes(int $length); // Raw bytes
     public function getString(int $length, int $bits = 6); // String [0-9a-zA-Z,-]+     public function getString(int $length, int $bits = 6); // String [0-9a-zA-Z,-]+
-    public function seed($seed = NULL); // No use with CS RNG, return TRUE always+    public function seed($seed = NULL); // No use with CS RNG, raise exception
-    public function getState(); // Return string representation PRNG state. No use with CS RNG, return NULL+    public function getState(); // Return string representation PRNG state. No use with CS RNG, raise exception
-    public function setState(string $state); // Set PRNG state. No use with CS RNG, return TRUE always+    public function setState(string $state); // Set PRNG state. No use with CS RNG, raise exception
-    public function getCount(); // No use with CS RNG, return 0 always+    public function getCount(); // No use with CS RNG, raise exception
-    public function getReseedCycle(); // No use with CS RNG, return 0 always+    public function getReseedCycle(); // No use with CS RNG, raise exception
-    public function setReseedCycle(int $count); // No use with CS RNG, return TRUE always.+    public function setReseedCycle(int $count); // No use with CS RNG, raise exception.
 } }
  
Line 130: Line 130:
     public function __construct($seed = NULL) {     public function __construct($seed = NULL) {
       $this->seed($seed);       $this->seed($seed);
 +    }
 +
 +    private reseed() {
 +      $this->count++;
 +      if ($this->reseed && !($this->count % $this->reseed)) {
 +        $this->seed();
 +        $this->count = 1;
 +      }
     }     }
          
     public function getInt($min = NULL, $max = NULL) {     public function getInt($min = NULL, $max = NULL) {
       assert($min <= $max);       assert($min <= $max);
 +      $this->reseed();
       if ($min && $max) {       if ($min && $max) {
         return mt_rand($min, $max);         return mt_rand($min, $max);
Line 149: Line 158:
          
     public function getBytes(int $length) {     public function getBytes(int $length) {
-      // Return raw random bytes +      // Return raw random bytes. 3 out of 4 bytes are used not to disclose full PRNG state
     }     }
          
Line 163: Line 172:
         // Update state by user seed         // Update state by user seed
         mt_srand($seed);         mt_srand($seed);
 +        $this->reseed = 0;
       } else {       } else {
         // Seed by system generated random value         // Seed by system generated random value
Line 209: Line 219:
 </code> </code>
  
-uint32_t BG(mt_rand_is_seeded) is used for already seeded flag and counter. Upper 16 bits are used for seeded flag, lower 16 bits are used for counters. Therefore, max reseed count is 2^16.+uint32_t BG(mt_rand_is_seeded) is used for already seeded flag and counter. MSB is used for seeded flag, the rest bits are used for counters. Therefore, max reseed count is 2^31.
  
  
Line 217: Line 227:
 mt_srand()/srand() returned nothing previously. mt_srand()/srand() returned nothing previously.
  
-If users want static random values, they have to use RandomStatus object to get it. Use of mt_srand()/srand() would be rare in general.+If users want static random values, they have to use Random object to get certain random sequence. i.e. Call mt_srand()/srand() for Random object, then use it with functions, rand()/mt_rand()/shuffle()/etc. Use of mt_srand()/srand() would be rare in general.
  
 ===== Proposed PHP Version(s) ===== ===== Proposed PHP Version(s) =====
rfc/improve_predictable_prng_random.1486096459.txt.gz · Last modified: 2017/09/22 13:28 (external edit)