vendor/symfony/uid/UuidV6.php line 21

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.  * A v6 UUID is lexicographically sortable and contains a 60-bit timestamp and 62 extra unique bits.
  13.  *
  14.  * Unlike UUIDv1, this implementation of UUIDv6 doesn't leak the MAC address of the host.
  15.  *
  16.  * @author Nicolas Grekas <p@tchwork.com>
  17.  */
  18. class UuidV6 extends Uuid
  19. {
  20.     protected const TYPE 6;
  21.     private static $node;
  22.     public function __construct(string $uuid null)
  23.     {
  24.         if (null === $uuid) {
  25.             $this->uid = static::generate();
  26.         } else {
  27.             parent::__construct($uuid);
  28.         }
  29.     }
  30.     public function getDateTime(): \DateTimeImmutable
  31.     {
  32.         return BinaryUtil::hexToDateTime('0'.substr($this->uid08).substr($this->uid94).substr($this->uid153));
  33.     }
  34.     public function getNode(): string
  35.     {
  36.         return substr($this->uid24);
  37.     }
  38.     public static function generate(\DateTimeInterface $time nullUuid $node null): string
  39.     {
  40.         $uuidV1 UuidV1::generate($time$node);
  41.         $uuid substr($uuidV1153).substr($uuidV194).$uuidV1[0].'-'.substr($uuidV114).'-6'.substr($uuidV153).substr($uuidV1186);
  42.         if ($node) {
  43.             return $uuid.substr($uuidV124);
  44.         }
  45.         // uuid_create() returns a stable "node" that can leak the MAC of the host, but
  46.         // UUIDv6 prefers a truly random number here, let's XOR both to preserve the entropy
  47.         if (null === self::$node) {
  48.             $seed = [random_int(00xffffff), random_int(00xffffff)];
  49.             $node unpack('N2'hex2bin('00'.substr($uuidV1246)).hex2bin('00'.substr($uuidV130)));
  50.             self::$node sprintf('%06x%06x', ($seed[0] ^ $node[1]) | 0x010000$seed[1] ^ $node[2]);
  51.         }
  52.         return $uuid.self::$node;
  53.     }
  54. }