例子:
由PHP的v4生成的UUID:
8bc278cb-2fb6-413b-add6-8ba39bf830e8
我想将其转换为两个64位整数。
我尝试使用PHP的hexdec,但它返回的是数字类型。我需要整数类型。
有趣的是:
我尝试使用hexdec将上述uuid转换,并使用此输出进行dechex。但是,为什么没有得到相同的值呢?
如果您有任何见解,将不胜感激。
例子:
由PHP的v4生成的UUID:
8bc278cb-2fb6-413b-add6-8ba39bf830e8
我想将其转换为两个64位整数。
我尝试使用PHP的hexdec,但它返回的是数字类型。我需要整数类型。
有趣的是:
我尝试使用hexdec将上述uuid转换,并使用此输出进行dechex。但是,为什么没有得到相同的值呢?
如果您有任何见解,将不胜感激。
UUID是一种128位的数据类型。除去6个保留位,它有122个数据位。这使得将任何UUID完全转换为64位整数变得不可能。您至少需要将其存储为2个64位数字或4个32位数字。
您可以将UUID解包成二进制格式,然后将其拆分为4个32位无符号字符:
function uuidToHex($uuid) {
return str_replace('-', '', $uuid);
}
function hexToUuid($hex) {
$regex = '/^([\da-f]{8})([\da-f]{4})([\da-f]{4})([\da-f]{4})([\da-f]{12})$/';
return preg_match($regex, $hex, $matches) ?
"{$matches[1]}-{$matches[2]}-{$matches[3]}-{$matches[4]}-{$matches[5]}" :
FALSE;
}
function hexToIntegers($hex) {
$bin = pack('h*', $hex);
return unpack('L*', $bin);
}
function integersToHex($integers) {
$args = $integers; $args[0] = 'L*'; ksort($args);
$bin = call_user_func_array('pack', $args);
$results = unpack('h*', $bin);
return $results[1];
}
$uuid = '1968ec4a-2a73-11df-9aca-00012e27a270';
var_dump($uuid);
$integers = hexToIntegers(uuidToHex('1968ec4a-2a73-11df-9aca-00012e27a270'));
var_dump($integers);
$uuid = hexToUuid(integersToHex($integers));
var_dump($uuid);
string(36) "1968ec4a-2a73-11df-9aca-00012e27a270"
array(4) {
[1]=>
int(2764998289)
[2]=>
int(4245764002)
[3]=>
int(268479657)
[4]=>
int(120222434)
}
string(36) "1968ec4a-2a73-11df-9aca-00012e27a270"
$integers
是一个包含4个32位数字的数组,表示十六进制。
9,223,372,036,854,775,807
,而一个无符号的64位整数的最大值为18,446,744,073,709,551,615
。一个UUID作为两个64位整数需要支持高达18,446,744,073,709,551,615
的值。4,294,967,295
,64位PHP可以支持。)
如果您只是想以更优化的方式存储UUID,可以将其转换为16字节的二进制字符串:
$uuid = '1968ec4a-2a73-11df-9aca-00012e27a270';
$binaryUuid = hex2bin(str_replace('-', '', $uuid));