8) * @param bool $force_length [default=false] if set to true and we have * uneven length, then we shorten to this length * @return string Uniq id */ private static function uniqIdL(int $length = 64, bool $force_length = false): string { $uniqid_length = ($length < 4) ? 4 : $length; if ($force_length) { $uniqid_length++; } /** @var int<1,max> make sure that internal this is correct */ $random_bytes_length = ($uniqid_length - ($uniqid_length % 2)) / 2; $uniqid = bin2hex(random_bytes($random_bytes_length)); // if not forced shorten return next lower length if (!$force_length) { return $uniqid; } return substr($uniqid, 0, $length); } /** * creates psuedo random uuid v4 * Code take from class here: * https://www.php.net/manual/en/function.uniqid.php#94959 * * @return string pseudo random uuid v4 */ public static function uuidv4(): string { /* return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x', // 32 bits for "time_low" mt_rand(0, 0xffff), mt_rand(0, 0xffff), // 16 bits for "time_mid" mt_rand(0, 0xffff), // 16 bits for "time_hi_and_version", // four most significant bits holds version number 4 mt_rand(0, 0x0fff) | 0x4000, // 16 bits, 8 bits for "clk_seq_hi_res", // 8 bits for "clk_seq_low", // two most significant bits holds zero and one for variant DCE1.1 mt_rand(0, 0x3fff) | 0x8000, // 48 bits for "node" mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff) ); */ $data = random_bytes(16); assert(strlen($data) == 16); // 0-1: 32 bits for "time_low" // 2: 16 bits for "time_mid" // 3: 16 bits for "time_hi_and_version", // four most significant bits holds version number 4 $data[6] = chr(ord($data[6]) & 0x0f | 0x40); // set version to 0100 // 4: 16 bits, 8 bits for "clk_seq_hi_res", // 8 bits for "clk_seq_low", // two most significant bits holds zero and one for variant DCE1.1 $data[8] = chr(ord($data[8]) & 0x3f | 0x80); // set bits 6-7 to 10 // 5-7: 48 bits for "node" return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4)); } /** * creates a uniq id based on lengths * * @param int|string $length Either length in int, or fallback type for length * for string type md5 (32), sha256 (64) * STANDARD_HASH_LONG: ripemd160 (40) * STANDARD_HASH_SHORT: adler32 (8) * It is recommended to use the integer * @param bool $force_length [default=false] if set to true and we have * uneven length, then we shorten to this length * @return string Uniq id */ public static function uniqId( int|string $length = self::DEFAULT_UNNIQ_ID_LENGTH, bool $force_length = false ): string { if (is_int($length)) { return self::uniqIdL($length, $force_length); } switch ($length) { case 'md5': $length = 32; break; case 'sha256': $length = 64; break; case self::STANDARD_HASH_LONG: $length = 40; break; case self::STANDARD_HASH_SHORT: $length = 8; break; default: $length = 64; break; } return self::uniqIdL($length); } /** * create a unique id with the standard hash type defined in __hash * * @return string Unique ID with fixed length of 8 characters */ public static function uniqIdShort(): string { return self::uniqId(self::STANDARD_HASH_SHORT); } /** * create a unique id with the standard long hash type * defined in __hashLong * * @return string Unique ID with length of current default long hash */ public static function uniqIdLong(): string { return self::uniqId(self::STANDARD_HASH_LONG); } } // __END__