Page MenuHomeDevCentral

No OneTemporary

diff --git a/src/Identifiers/Random.php b/src/Identifiers/Random.php
index b7cfc58..c04e5e0 100644
--- a/src/Identifiers/Random.php
+++ b/src/Identifiers/Random.php
@@ -1,119 +1,128 @@
<?php
declare(strict_types=1);
namespace Keruald\OmniTools\Identifiers;
use Closure;
use InvalidArgumentException;
+use Keruald\OmniTools\Strings\Multibyte\StringUtilities;
+
class Random {
/**
* @return string 32 random hexadecimal characters
*/
public static function generateHexHash () : string {
return UUID::UUIDv4WithoutHyphens();
}
/**
* @param string $format A for letters, 1 for digits, e.g. AAA111
*
* @return string a random string based on the format e.g. ZCK530
*/
public static function generateString (string $format) : string {
$randomString = "";
$len = strlen($format);
for ($i = 0 ; $i < $len ; $i++) {
$randomString .= self::generateCharacter($format[$i]);
}
return $randomString;
}
/**
* @param string $format A for letters, 1 for digits, e.g. A
*
* @return string a random string based on the format e.g. Z
*/
public static function generateCharacter (string $format) : string {
return self::getPicker(self::normalizeFormat($format))();
}
+
+ public static function generateIdentifier (int $bytes_count) : string {
+ $bytes = random_bytes($bytes_count);
+
+ return StringUtilities::encodeInBase64($bytes);
+ }
+
///
/// Helper methods for pickers
///
public static function normalizeFormat (string $format) : string {
$normalizers = self::getNormalizers();
foreach ($normalizers as $normalizedFormat => $conditionClosure) {
if ($conditionClosure($format)) {
return (string)$normalizedFormat;
}
}
return $format;
}
private static function getNormalizers () : array {
/**
* <normalized format> => <method which returns true if format matches>
*/
return [
'A' => function ($format) : bool {
return ctype_upper($format);
},
'a' => function ($format) : bool {
return ctype_lower($format);
},
'1' => function ($format) : bool {
return is_numeric($format);
},
];
}
private static function getPickers () : array {
return [
'A' => function () : string {
return Random::pickLetter();
},
'a' => function () : string {
return strtolower(Random::pickLetter());
},
'1' => function () : string {
return (string)Random::pickDigit();
},
];
}
public static function pickLetter () : string {
$asciiCode = 65 + mt_rand() % 26;
return chr($asciiCode);
}
public static function pickDigit (int $base = 10) : int {
return mt_rand() % $base;
}
private static function getPicker (string $format) : Closure {
$pickers = self::getPickers();
if (isset($pickers[$format])) {
return $pickers[$format];
}
throw new InvalidArgumentException();
}
}
diff --git a/tests/Identifiers/RandomTest.php b/tests/Identifiers/RandomTest.php
index 75ebe88..7c1f8c2 100644
--- a/tests/Identifiers/RandomTest.php
+++ b/tests/Identifiers/RandomTest.php
@@ -1,54 +1,61 @@
<?php
declare(strict_types=1);
namespace Keruald\OmniTools\Tests\Identifiers;
use Keruald\OmniTools\Identifiers\Random;
use Phpunit\Framework\TestCase;
class RandomTest extends TestCase {
///
/// Tests
///
public function testGenerateHexadecimalHash () : void {
$hash = Random::generateHexHash();
$this->assertEquals(
32, strlen($hash),
"$hash size must be 32 characters"
);
$this->assertRegExp("/[0-9a-f]{32}/", $hash);
}
public function testHexadecimalHashesAreUnique() : void {
$this->assertNotEquals(
Random::generateHexHash(),
Random::generateHexHash()
);
}
/**
* @dataProvider provideRandomStringFormats
*/
public function testRandomString($format, $re, $len) : void {
$string = Random::generateString($format);
$this->assertEquals($len, strlen($format));
$this->assertRegExp($re, $string);
}
+ public function testGenerateIdentifier() : void {
+ $identifier = Random::generateIdentifier(20);
+
+ $this->assertEquals(27, strlen($identifier));
+ $this->assertRegExp("/^[A-Z0-9\-_]*$/i", $identifier);
+ }
+
///
/// Data providers
///
public function provideRandomStringFormats() : iterable {
yield ["AAA111", "/^[A-Z]{3}[0-9]{3}$/", 6];
yield ["AAA123", "/^[A-Z]{3}[0-9]{3}$/", 6];
yield ["ABC123", "/^[A-Z]{3}[0-9]{3}$/", 6];
yield ["", "/^$/", 0];
}
}

File Metadata

Mime Type
text/x-diff
Expires
Thu, Sep 18, 09:23 (17 h, 34 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2987025
Default Alt Text
(5 KB)

Event Timeline