52 lines
1.5 KiB
PHP
52 lines
1.5 KiB
PHP
|
<?php declare(strict_types=1);
|
||
|
|
||
|
namespace BitBadger\PDODocument;
|
||
|
|
||
|
use Random\RandomException;
|
||
|
|
||
|
/**
|
||
|
* How automatic ID generation should be performed
|
||
|
*/
|
||
|
enum AutoId
|
||
|
{
|
||
|
/** Do not automatically generate IDs */
|
||
|
case None;
|
||
|
|
||
|
/** New documents with a 0 ID should receive max ID plus one */
|
||
|
case Number;
|
||
|
|
||
|
/** New documents with a blank ID should receive a v4 UUID (Universally Unique Identifier) */
|
||
|
case UUID;
|
||
|
|
||
|
/** New documents with a blank ID should receive a random string (set `Configuration::$idStringLength`) */
|
||
|
case RandomString;
|
||
|
|
||
|
/**
|
||
|
* Generate a v4 UUID
|
||
|
*
|
||
|
* @return string The v4 UUID
|
||
|
* @throws RandomException If an appropriate source of randomness cannot be found
|
||
|
*/
|
||
|
public static function generateUUID(): string
|
||
|
{
|
||
|
// hat tip: https://stackoverflow.com/a/15875555/276707
|
||
|
$bytes = random_bytes(16);
|
||
|
|
||
|
$bytes[6] = chr(ord($bytes[6]) & 0x0f | 0x40); // set version to 0100
|
||
|
$bytes[8] = chr(ord($bytes[8]) & 0x3f | 0x80); // set bits 6-7 to 10
|
||
|
|
||
|
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($bytes), 4));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Generate a random string ID
|
||
|
*
|
||
|
* @return string A string filled with the hexadecimal representation of random bytes
|
||
|
* @throws RandomException If an appropriate source of randomness cannot be found
|
||
|
*/
|
||
|
public static function generateRandom(): string
|
||
|
{
|
||
|
return bin2hex(random_bytes(Configuration::$idStringLength / 2));
|
||
|
}
|
||
|
}
|