147 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			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;
 | |
|     }
 | |
| } |