如何将php的uuid v4转换为两个64位整数

如何将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

例如: 从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位数字

参考文献
  • 堆栈溢出:
  • 堆栈溢出:
  • PHP手册:

  • 虽然在其他语言()中,将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位整数重新格式化为十六进制的代码吗?