FWIW, this is what i do (MySQL context):
/**
*
* pack with H* to ensure compatibility with MySQL function UNHEX.
*
* @param string $stringGuid
*
* @return string 16 bytes long
*
* @ref https://stackoverflow.com/questions/2839037/php-mysql-storing-and-retrieving-uuids
*/
function stringGuidAsBinaryGuid($stringGuid)
{
$binary = pack("H*" , str_replace('-' , '' , $stringGuid));
return $binary;
}
function binaryGuidAsStringGuid($binaryGuid)
{
$string = unpack("H*" , $binaryGuid);
$string = preg_replace(
"/([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})/" ,
"$1-$2-$3-$4-$5" ,
$string["1"]
);
return $string;
}
/***
*
* returns a valid GUID, v4 (string, 36 bytes)
*
* @link http://php.net/manual/en/function.com-create-guid.php
*
* @return string
*
*/
function GUID()
{
// prefer strong crypto variant
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));
}
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)
);
}