如何将php的uuid v4转换为两个64位整数
例如: 从php的v4生成的Uuid:如何将php的uuid v4转换为两个64位整数,php,uuid,Php,Uuid,例如: 从php的v4生成的Uuid: 8bc278cb-2fb6-413b-add6-8ba39bf830e8 我想把它转换成两个64位整数 我尝试使用php的hexdec,但它的返回值是数字。我想要数据类型整数 有趣的是: 我已经尝试将hexdec与上述uuid一起使用,并使用此输出来dechex。怎么可能,没有得到相同的值 对此的任何见解都将不胜感激。UUID是一种128位的数据类型。除去6个保留位,其中有122个数据位。无法将任何UUID完全转换为64位整数。您至少需要将其存储为2个64
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位数字
参考文献
虽然在其他语言()中,将UUID的最低有效位和最高有效位作为两个无符号64位整数是很常见的,但PHP在这方面遇到了问题,因为PHP中的所有整数都是有符号的。即使使用64位PHP构建,在尝试获取UUID最低或最高有效位的实际整数值时,也会遇到整数溢出 64位PHP上的最大整数值为
9223372036854775807
,而无符号64位整数的最大值为18446744073709551615
。作为两个64位整数的UUID需要支持高达18446744073709551615的值
正如前面提到的一个答案,如果需要将UUID拆分为四个无符号32位整数,那么最好将其拆分为四个无符号32位整数。(无符号32位整数的最大值为4294967295
,64位PHP可以支持该值。)
如果您只是想以更优化的方式存储UUID,可以将其转换为16字节的二进制字符串:
$uuid = '1968ec4a-2a73-11df-9aca-00012e27a270';
$binaryUuid = hex2bin(str_replace('-', '', $uuid));
随机UUID(v4)总共有2^122个组合。而64位整数有2^64个组合。后者似乎不可能在前一个中包含所有可能的数据。是如何在PHP中将字节数组转换为浮点。我已尝试从函数返回的两个64位整数重新形成十六进制。它不匹配1968ec4a-2a73-11df-9aca-00012e27a270
。理想情况下,它应该匹配。你能告诉我你用来将2 64位整数重新格式化为十六进制的代码吗?