vendor/symfony/uid/Uuid.php line 19

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Symfony\Component\Uid;
  11. /**
  12.  * @author GrĂ©goire Pineau <lyrixx@lyrixx.info>
  13.  *
  14.  * @see https://tools.ietf.org/html/rfc4122#appendix-C for details about namespaces
  15.  */
  16. class Uuid extends AbstractUid
  17. {
  18.     public const NAMESPACE_DNS '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
  19.     public const NAMESPACE_URL '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
  20.     public const NAMESPACE_OID '6ba7b812-9dad-11d1-80b4-00c04fd430c8';
  21.     public const NAMESPACE_X500 '6ba7b814-9dad-11d1-80b4-00c04fd430c8';
  22.     protected const TYPE 0;
  23.     protected const NIL '00000000-0000-0000-0000-000000000000';
  24.     public function __construct(string $uuid)
  25.     {
  26.         $type preg_match('{^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$}Di'$uuid) ? (int) $uuid[14] : false;
  27.         if (false === $type || (static::TYPE ?: $type) !== $type) {
  28.             throw new \InvalidArgumentException(sprintf('Invalid UUID%s: "%s".', static::TYPE 'v'.static::TYPE ''$uuid));
  29.         }
  30.         $this->uid strtolower($uuid);
  31.     }
  32.     /**
  33.      * @return static
  34.      */
  35.     public static function fromString(string $uuid): parent
  36.     {
  37.         if (22 === \strlen($uuid) && 22 === strspn($uuidBinaryUtil::BASE58[''])) {
  38.             $uuid str_pad(BinaryUtil::fromBase($uuidBinaryUtil::BASE58), 16"\0", \STR_PAD_LEFT);
  39.         }
  40.         if (16 === \strlen($uuid)) {
  41.             // don't use uuid_unparse(), it's slower
  42.             $uuid bin2hex($uuid);
  43.             $uuid substr_replace($uuid'-'80);
  44.             $uuid substr_replace($uuid'-'130);
  45.             $uuid substr_replace($uuid'-'180);
  46.             $uuid substr_replace($uuid'-'230);
  47.         } elseif (26 === \strlen($uuid) && Ulid::isValid($uuid)) {
  48.             $ulid = new Ulid('00000000000000000000000000');
  49.             $ulid->uid strtoupper($uuid);
  50.             $uuid $ulid->toRfc4122();
  51.         }
  52.         if (__CLASS__ !== static::class || 36 !== \strlen($uuid)) {
  53.             return new static($uuid);
  54.         }
  55.         if (self::NIL === $uuid) {
  56.             return new NilUuid();
  57.         }
  58.         switch ($uuid[14]) {
  59.             case UuidV1::TYPE: return new UuidV1($uuid);
  60.             case UuidV3::TYPE: return new UuidV3($uuid);
  61.             case UuidV4::TYPE: return new UuidV4($uuid);
  62.             case UuidV5::TYPE: return new UuidV5($uuid);
  63.             case UuidV6::TYPE: return new UuidV6($uuid);
  64.         }
  65.         return new self($uuid);
  66.     }
  67.     final public static function v1(): UuidV1
  68.     {
  69.         return new UuidV1();
  70.     }
  71.     final public static function v3(self $namespacestring $name): UuidV3
  72.     {
  73.         // don't use uuid_generate_md5(), some versions are buggy
  74.         $uuid md5(hex2bin(str_replace('-'''$namespace->uid)).$nametrue);
  75.         return new UuidV3(self::format($uuid'-3'));
  76.     }
  77.     final public static function v4(): UuidV4
  78.     {
  79.         return new UuidV4();
  80.     }
  81.     final public static function v5(self $namespacestring $name): UuidV5
  82.     {
  83.         // don't use uuid_generate_sha1(), some versions are buggy
  84.         $uuid substr(sha1(hex2bin(str_replace('-'''$namespace->uid)).$nametrue), 016);
  85.         return new UuidV5(self::format($uuid'-5'));
  86.     }
  87.     final public static function v6(): UuidV6
  88.     {
  89.         return new UuidV6();
  90.     }
  91.     public static function isValid(string $uuid): bool
  92.     {
  93.         if (!preg_match('{^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$}Di'$uuid)) {
  94.             return false;
  95.         }
  96.         return __CLASS__ === static::class || static::TYPE === (int) $uuid[14];
  97.     }
  98.     public function toBinary(): string
  99.     {
  100.         return uuid_parse($this->uid);
  101.     }
  102.     public function toRfc4122(): string
  103.     {
  104.         return $this->uid;
  105.     }
  106.     public function compare(AbstractUid $other): int
  107.     {
  108.         if (false !== $cmp uuid_compare($this->uid$other->uid)) {
  109.             return $cmp;
  110.         }
  111.         return parent::compare($other);
  112.     }
  113.     private static function format(string $uuidstring $version): string
  114.     {
  115.         $uuid[8] = $uuid[8] & "\x3F" "\x80";
  116.         $uuid substr_replace(bin2hex($uuid), '-'80);
  117.         $uuid substr_replace($uuid$version131);
  118.         $uuid substr_replace($uuid'-'180);
  119.         return substr_replace($uuid'-'230);
  120.     }
  121. }