• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • com_create_guid()

    (PHP 5, PHP 7)

    Generate a globally unique identifier(GUID)

    说明

    com_create_guid(void): string

    Generates a Globally Unique Identifier(GUID).

    A GUID is generated in the same way as DCE UUID's, except that the Microsoft convention is to enclose a GUID in curly braces.

    返回值

    Returns the GUID as a string.

    参见

    • uuid_create() in the PECL uuid extension
    The phunction PHP framework (http://sourceforge.net/projects/phunction/) uses the following function to generate valid version 4 UUIDs:
    <?php
    function GUID()
    {
      if (function_exists('com_create_guid') === true)
      {
        return trim(com_create_guid(), '{}');
      }
      return sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));
    }
    ?>
    The output generated by the sprintf() and mt_rand() calls is identical to com_create_guid() results.
    Use more cryptographically strong algorithm to generate pseudo-random bytes and format it as GUID v4 string
    function guidv4()
    {
      if (function_exists('com_create_guid') === true)
        return trim(com_create_guid(), '{}');
      $data = openssl_random_pseudo_bytes(16);
      $data[6] = chr(ord($data[6]) & 0x0f | 0x40); // set version to 0100
      $data[8] = chr(ord($data[8]) & 0x3f | 0x80); // set bits 6-7 to 10
      return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
    }
    Here's my final version of a GUIDv4 function (based on others work here) that should work on all platforms and gracefully fallback to less cryptographically secure version if others are not supported...
    <?php
    /**
     * Returns a GUIDv4 string
     *
     * Uses the best cryptographically secure method 
     * for all supported pltforms with fallback to an older, 
     * less secure version.
     *
     * @param bool $trim
     * @return string
     */
    function GUIDv4 ($trim = true)
    {
      // Windows
      if (function_exists('com_create_guid') === true) {
        if ($trim === true)
          return trim(com_create_guid(), '{}');
        else
          return com_create_guid();
      }
      // OSX/Linux
      if (function_exists('openssl_random_pseudo_bytes') === true) {
        $data = openssl_random_pseudo_bytes(16);
        $data[6] = chr(ord($data[6]) & 0x0f | 0x40);  // set version to 0100
        $data[8] = chr(ord($data[8]) & 0x3f | 0x80);  // set bits 6-7 to 10
        return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
      }
      // Fallback (PHP 4.2+)
      mt_srand((double)microtime() * 10000);
      $charid = strtolower(md5(uniqid(rand(), true)));
      $hyphen = chr(45);         // "-"
      $lbrace = $trim ? "" : chr(123);  // "{"
      $rbrace = $trim ? "" : chr(125);  // "}"
      $guidv4 = $lbrace.
           substr($charid, 0, 8).$hyphen.
           substr($charid, 8, 4).$hyphen.
           substr($charid, 12, 4).$hyphen.
           substr($charid, 16, 4).$hyphen.
           substr($charid, 20, 12).
           $rbrace;
      return $guidv4;
    }
    ?>
    
    If you're going to generate random UUIDs, at least make them conform:
    * The uppermost byte of the third stanza must be 4
    * the uppermost byte of the fourth stanza may be any of (8 9 a b)
    see also: The wikipedia page for UUIDs: https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_.28random.29
    I implemented a com_create_guid implementation for systems that do not support it as a Composer package in order to keep it separated from my applications 
    https://github.com/rogervila/com_create_guid

    下篇:com_event_sink()