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