From 965367c8c44fb2c47027d0ffe6d5eed08c6613bd Mon Sep 17 00:00:00 2001 From: Maik Penz Date: Tue, 5 Feb 2013 17:13:54 +0100 Subject: [PATCH 1/7] uuid provider and test --- src/Faker/Provider/Uuid.php | 50 ++++++++++++++++++++++++++++++++ test/Faker/Provider/UuidTest.php | 26 +++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 src/Faker/Provider/Uuid.php create mode 100644 test/Faker/Provider/UuidTest.php diff --git a/src/Faker/Provider/Uuid.php b/src/Faker/Provider/Uuid.php new file mode 100644 index 00000000..9fbf019e --- /dev/null +++ b/src/Faker/Provider/Uuid.php @@ -0,0 +1,50 @@ + $tmpVal) { + $byte[$tmpKey-1] = $tmpVal; + } + + // b2f + $tLo = ($byte[0] << 24) | ($byte[1] << 16) | ($byte[2] << 8) | $byte[3]; + $tMi = ($byte[4] << 8) | $byte[5]; + $tHi = ($byte[6] << 8) | $byte[7]; + $csLo = $byte[9]; + $csHi = $byte[8] & 0x3f | (1 << 7); + + // if needed to make it big endian + if (pack('L', 0x6162797A) == pack('N', 0x6162797A)) { + $tLo = (($tLo & 0x000000ff) << 24) | (($tLo & 0x0000ff00) << 8) + | (($tLo & 0x00ff0000) >> 8) | (($tLo & 0xff000000) >> 24); + $tMi = (($tMi & 0x00ff) << 8) | (($tMi & 0xff00) >> 8); + $tHi = (($tHi & 0x00ff) << 8) | (($tHi & 0xff00) >> 8); + } + + // apply version + $tHi &= 0x0fff; + $tHi |= (3 << 12); + + // cast to string + $uuid = sprintf( + '%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x', + $tLo, $tMi, $tHi, $csHi, $csLo, + $byte[10], $byte[11], $byte[12], $byte[13], $byte[14], $byte[15] + ); + + return $uuid; + } +} diff --git a/test/Faker/Provider/UuidTest.php b/test/Faker/Provider/UuidTest.php new file mode 100644 index 00000000..a4b6a95d --- /dev/null +++ b/test/Faker/Provider/UuidTest.php @@ -0,0 +1,26 @@ +assertTrue($this->isUuid($uuid)); + } + + public function testUuidExpectedSeed() + { + mt_srand(123); + $this->assertEquals("8eea2b29-832f-3633-985c-b2a257eabb5a", BaseProvider::uuid()); + $this->assertEquals("9424cf48-58b3-3b7d-b89f-c049e9f5d31f", BaseProvider::uuid()); + } + + protected function isUuid($uuid) + { + return is_string($uuid) && (bool) preg_match('/^[a-f0-9]{8,8}-(?:[a-f0-9]{4,4}-){3,3}[a-f0-9]{12,12}$/i', $uuid); + } +} From dc94119d7b50aff8ab6f4d671ee67b667f488fcf Mon Sep 17 00:00:00 2001 From: Maik Penz Date: Tue, 5 Feb 2013 17:44:26 +0100 Subject: [PATCH 2/7] simplified uuid generation, fixed comments --- src/Faker/Provider/Uuid.php | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/Faker/Provider/Uuid.php b/src/Faker/Provider/Uuid.php index 9fbf019e..d96f40f2 100644 --- a/src/Faker/Provider/Uuid.php +++ b/src/Faker/Provider/Uuid.php @@ -14,12 +14,9 @@ class Uuid extends \Faker\Provider\Base // Hash the seed and convert to a byte array $val = md5($seed, true); - $byte = array(); - foreach (unpack('C16', $val) as $tmpKey => $tmpVal) { - $byte[$tmpKey-1] = $tmpVal; - } + $byte = array_values(unpack('C16', $val)); - // b2f + // extract fields from byte array $tLo = ($byte[0] << 24) | ($byte[1] << 16) | ($byte[2] << 8) | $byte[3]; $tMi = ($byte[4] << 8) | $byte[5]; $tHi = ($byte[6] << 8) | $byte[7]; @@ -34,7 +31,7 @@ class Uuid extends \Faker\Provider\Base $tHi = (($tHi & 0x00ff) << 8) | (($tHi & 0xff00) >> 8); } - // apply version + // apply version number $tHi &= 0x0fff; $tHi |= (3 << 12); From 8a979bb5b98803786a2b3205e7e69e2041ba9188 Mon Sep 17 00:00:00 2001 From: Maik Penz Date: Tue, 5 Feb 2013 20:51:04 +0100 Subject: [PATCH 3/7] Kindly asking travis to test again Made a comment for explicit --- src/Faker/Provider/Uuid.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Faker/Provider/Uuid.php b/src/Faker/Provider/Uuid.php index d96f40f2..764152fe 100644 --- a/src/Faker/Provider/Uuid.php +++ b/src/Faker/Provider/Uuid.php @@ -23,7 +23,7 @@ class Uuid extends \Faker\Provider\Base $csLo = $byte[9]; $csHi = $byte[8] & 0x3f | (1 << 7); - // if needed to make it big endian + // correct byte order for big edian architecture if (pack('L', 0x6162797A) == pack('N', 0x6162797A)) { $tLo = (($tLo & 0x000000ff) << 24) | (($tLo & 0x0000ff00) << 8) | (($tLo & 0x00ff0000) >> 8) | (($tLo & 0xff000000) >> 24); From 9362a18d60087afecc6542a2a3978e1b575ccf4c Mon Sep 17 00:00:00 2001 From: Maik Penz Date: Tue, 5 Feb 2013 21:30:05 +0100 Subject: [PATCH 4/7] 32bit compat fix Using PHP_INT_MAX caused uuid sequences that depend on word size. --- src/Faker/Provider/Uuid.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Faker/Provider/Uuid.php b/src/Faker/Provider/Uuid.php index 764152fe..b58f863e 100644 --- a/src/Faker/Provider/Uuid.php +++ b/src/Faker/Provider/Uuid.php @@ -10,7 +10,8 @@ class Uuid extends \Faker\Provider\Base */ public static function uuid() { - $seed = mt_rand(0, PHP_INT_MAX); + // fix for compatibility with 32bit architecture; seed range restricted to 62bit + $seed = mt_rand(0, 2147483648) . '#' . mt_rand(0, 2147483648); // Hash the seed and convert to a byte array $val = md5($seed, true); From 9870a9c9262bb8d10e97f53a8a81ef72db744554 Mon Sep 17 00:00:00 2001 From: Maik Penz Date: Tue, 5 Feb 2013 21:33:15 +0100 Subject: [PATCH 5/7] Adjusted test to new seed range. --- test/Faker/Provider/UuidTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/Faker/Provider/UuidTest.php b/test/Faker/Provider/UuidTest.php index a4b6a95d..fceb8dfe 100644 --- a/test/Faker/Provider/UuidTest.php +++ b/test/Faker/Provider/UuidTest.php @@ -15,8 +15,8 @@ class UuidTest extends \PHPUnit_Framework_TestCase public function testUuidExpectedSeed() { mt_srand(123); - $this->assertEquals("8eea2b29-832f-3633-985c-b2a257eabb5a", BaseProvider::uuid()); - $this->assertEquals("9424cf48-58b3-3b7d-b89f-c049e9f5d31f", BaseProvider::uuid()); + $this->assertEquals("8e2e0c84-50dd-367c-9e66-f3ab455c78d6", BaseProvider::uuid()); + $this->assertEquals("073eb60a-902c-30ab-93d0-a94db371f6c8", BaseProvider::uuid()); } protected function isUuid($uuid) From d24287d67a5296fdb08789ad31e4710806bfd2f8 Mon Sep 17 00:00:00 2001 From: Maik Penz Date: Tue, 5 Feb 2013 21:34:41 +0100 Subject: [PATCH 6/7] Fixed range mistake. --- src/Faker/Provider/Uuid.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Faker/Provider/Uuid.php b/src/Faker/Provider/Uuid.php index b58f863e..eb6cf7b4 100644 --- a/src/Faker/Provider/Uuid.php +++ b/src/Faker/Provider/Uuid.php @@ -11,7 +11,7 @@ class Uuid extends \Faker\Provider\Base public static function uuid() { // fix for compatibility with 32bit architecture; seed range restricted to 62bit - $seed = mt_rand(0, 2147483648) . '#' . mt_rand(0, 2147483648); + $seed = mt_rand(0, 2147483647) . '#' . mt_rand(0, 2147483647); // Hash the seed and convert to a byte array $val = md5($seed, true); From 64cb2172c25d090f1e56b41bfc67a2ba1b53b3cd Mon Sep 17 00:00:00 2001 From: Maik Penz Date: Wed, 6 Feb 2013 09:14:15 +0100 Subject: [PATCH 7/7] added uuid to default providers --- readme.md | 4 ++++ src/Faker/Factory.php | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 8fe80a4c..b2259910 100644 --- a/readme.md +++ b/readme.md @@ -173,6 +173,10 @@ Each of the generator properties (like `name`, `address`, and `lorem`) are calle opera // 'Opera/8.25 (Windows NT 5.1; en-US) Presto/2.9.188 Version/10.00' internetExplorer // 'Mozilla/5.0 (compatible; MSIE 7.0; Windows 98; Win 9x 4.90; Trident/3.0)' +### `Faker\Provider\Uuid` + + uuid // '7e57d004-2b97-0e7a-b45f-5387367791cd' + ## Localization `Faker\Factory` can take a locale as an argument, to return localized data. If no localized provider is found, the factory fallbacks to the default locale (en_EN). diff --git a/src/Faker/Factory.php b/src/Faker/Factory.php index ec19aa2d..6a9d4fc4 100644 --- a/src/Faker/Factory.php +++ b/src/Faker/Factory.php @@ -6,7 +6,7 @@ class Factory { const DEFAULT_LOCALE = 'en_US'; - protected static $defaultProviders = array('Person', 'Address', 'PhoneNumber', 'Company', 'Lorem', 'Internet', 'DateTime', 'Miscellaneous', 'UserAgent'); + protected static $defaultProviders = array('Person', 'Address', 'PhoneNumber', 'Company', 'Lorem', 'Internet', 'DateTime', 'Miscellaneous', 'UserAgent', 'Uuid'); public static function create($locale = self::DEFAULT_LOCALE) {