2025-02-03 18:49:47 +03:00

147 lines
4.3 KiB
PHP

<?php
namespace goodboyalex\php_components_pack\extensions;
use Random\RandomException;
/**
* Расширение Guid.
*
* @author Александр Бабаев
* @package php_components_pack
* @version 1.0
* @since 1.0
*/
final class GUIDExtension
{
/**
* Пустой Guid.
*/
public const string GUIDEmpty = "00000000-0000-0000-0000-000000000000";
/**
* Генерирует Guid.
*
* @return string Сгенерированный Guid.
*/
public static function Generate (): string
{
// Цикл создания Guid
do
$guid = self::DoGenerate();
// - пока Guid не будет корректен
while (!self::Validate($guid));
// Возвращаем Guid
return $guid;
}
/**
* Генерирует Guid.
*
* @return string Сгенерированный Guid.
*/
private static function DoGenerate (): string
{
try {
return sprintf(
'%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
// 32 bits for "time_low"
random_int(0, 0xffff),
random_int(0, 0xffff),
// 16 bits for "time_mid"
random_int(0, 0xffff),
// 16 bits for "time_hi_and_version",
// four most significant bits holds version number 4
random_int(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
random_int(0, 0x3fff) | 0x8000,
// 48 bits for "node"
random_int(0, 0xffff),
random_int(0, 0xffff),
random_int(0, 0xffff)
);
}
catch (RandomException) {
return self::GUIDEmpty;
}
}
/**
* Проверяет Guid на корректность.
*
* @param string|null $str Guid на проверку
*
* @return bool Корректен ли Guid.
*/
public static function Validate (?string $str): bool
{
// Если Guid пустой
if (StringExtension::IsNullOrWhitespace($str))
// - возвращаем false
return false;
// Проверяем длину
$isLenCorrect = strlen($str) == 36;
// Если длина не корректна
if (!$isLenCorrect)
// - возвращаем false
return false;
// Разбиваем на части
$explodedStr = explode("-", $str);
// Если количество частей не равно 5
if (count($explodedStr) !== 5)
// - возвращаем false
return false;
// Проверяем длину каждой части
// - первая часть должна быть длиной 8 символов
if (strlen($explodedStr[0]) !== 8)
// -- возвращаем false
return false;
// - вторая часть должна быть длиной 4 символа
if (strlen($explodedStr[1]) !== 4)
// -- возвращаем false
return false;
// - третья часть должна быть длиной 4 символа
if (strlen($explodedStr[2]) !== 4)
// -- возвращаем false
return false;
// - четвертая часть должна быть длиной 4 символа
if (strlen($explodedStr[3]) !== 4)
// -- возвращаем false
return false;
// - пятая часть должна быть длиной 12 символов
if (strlen($explodedStr[4]) !== 12)
// -- возвращаем false
return false;
// Проверка пройдена
return true;
}
/**
* Проверяет Guid на пустоту.
*
* @param string|null $str Guid на проверку
*
* @return bool Пустой ли GUID
*/
public static function IsNotValidOrEmpty (?string $str): bool
{
return !self::Validate($str) || $str == self::GUIDEmpty;
}
}