20250203
This commit is contained in:
147
sources/extensions/GUIDExtension.php
Normal file
147
sources/extensions/GUIDExtension.php
Normal file
@@ -0,0 +1,147 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user