vendor/symfony/uid/UuidV1.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.  * A v1 UUID contains a 60-bit timestamp and 62 extra unique bits.
  13.  *
  14.  * @author GrĂ©goire Pineau <lyrixx@lyrixx.info>
  15.  */
  16. class UuidV1 extends Uuid
  17. {
  18.     protected const TYPE 1;
  19.     private static $clockSeq;
  20.     public function __construct(string $uuid null)
  21.     {
  22.         if (null === $uuid) {
  23.             $this->uid uuid_create(static::TYPE);
  24.         } else {
  25.             parent::__construct($uuid);
  26.         }
  27.     }
  28.     public function getDateTime(): \DateTimeImmutable
  29.     {
  30.         return BinaryUtil::hexToDateTime('0'.substr($this->uid153).substr($this->uid94).substr($this->uid08));
  31.     }
  32.     public function getNode(): string
  33.     {
  34.         return uuid_mac($this->uid);
  35.     }
  36.     public static function generate(\DateTimeInterface $time nullUuid $node null): string
  37.     {
  38.         $uuid = !$time || !$node uuid_create(static::TYPE) : parent::NIL;
  39.         if ($time) {
  40.             if ($node) {
  41.                 // use clock_seq from the node
  42.                 $seq substr($node->uid194);
  43.             } else {
  44.                 // generate a static random clock_seq to prevent any collisions with the real one
  45.                 $seq substr($uuid194);
  46.                 while (null === self::$clockSeq || $seq === self::$clockSeq) {
  47.                     self::$clockSeq sprintf('%04x'random_int(00x3FFF) | 0x8000);
  48.                 }
  49.                 $seq self::$clockSeq;
  50.             }
  51.             $time BinaryUtil::dateTimeToHex($time);
  52.             $uuid substr($time8).'-'.substr($time44).'-1'.substr($time13).'-'.$seq.substr($uuid23);
  53.         }
  54.         if ($node) {
  55.             $uuid substr($uuid024).substr($node->uid24);
  56.         }
  57.         return $uuid;
  58.     }
  59. }