From 849e0b9760d4762ad2c8820b70a863a5fa4c5785 Mon Sep 17 00:00:00 2001 From: Tim Otten Date: Wed, 16 Sep 2020 00:30:56 -0700 Subject: [PATCH] GenerateData - Make the generated sample data more stable (wrt mt_rand) --- CRM/Core/CodeGen/GenerateData.php | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/CRM/Core/CodeGen/GenerateData.php b/CRM/Core/CodeGen/GenerateData.php index 8ad5fdedf6..74e0a4d41a 100644 --- a/CRM/Core/CodeGen/GenerateData.php +++ b/CRM/Core/CodeGen/GenerateData.php @@ -27,8 +27,9 @@ class CRM_Core_CodeGen_GenerateData { /** * Class constructor */ - public function __construct() { + public function __construct($seed = '123456789') { // initialize all the vars + $this->seed = $seed; $this->numIndividual = self::INDIVIDUAL_PERCENT * self::NUM_CONTACT / 100; $this->numHousehold = self::HOUSEHOLD_PERCENT * self::NUM_CONTACT / 100; $this->numOrganization = self::ORGANIZATION_PERCENT * self::NUM_CONTACT / 100; @@ -104,6 +105,11 @@ class CRM_Core_CodeGen_GenerateData { * */ + /** + * @var int + */ + private $seed; + /** * enum's from database * @var array @@ -201,12 +207,17 @@ class CRM_Core_CodeGen_GenerateData { * * All other random() functions should derive from this. * + * This is very weak RNG. The goal is to provide a reproducible sequence of + * random-ish values for generating dummy-data. + * * @param int $min * @param int $max * @return int */ private function randomInt($min, $max) { - return mt_rand($min, $max); + $range = min(1 + $max - $min, mt_getrandmax()); + $this->seed = md5($this->seed . chr(0) . $min . chr(0) . $max); + return $min + (hexdec(substr($this->seed, 20, 8)) % $range); } /** -- 2.25.1