PHP 相当于 Java 的 getLeastSignificantBits() 和 getMostSignificantBits?
PHP equivalent of getLeastSignificantBits() & getMostSignificantBits from Java?
我在 PHP 中使用 UUID,我必须查询一个数据库,该数据库将 UUID 的最高有效位和最低有效位存储在两个单独的列中。我找到了 ,这似乎正是我在 PHP 中所需要的,但我不知道如何转换代码,而且我对字节操作从来都不擅长。
getLeastSignificantBits()
和 getMostSignificantBits()
的等效函数在 PHP 中是什么?谢谢!
编辑:示例数据(如果有帮助):
UUID: b33ac8a9-ae45-4120-bb6e-7537e271808e
...应该转换为...
Upper Bits: -5531888561172430560
Lower Bits: -4940882858296115058
你只需要两个库和 bcmath 扩展,
使用
composer require ramsey/uuid moontoast/math
.
使用Ramsey\Uuid\Uuid
解析UUID:
$uuid = \Ramsey\Uuid\Uuid::fromString('b33ac8a9-ae45-4120-bb6e-7537e271808e');
echo 'Upper Bits: ' . $uuid->getMostSignificantBits() . "\n";
echo 'Lower Bits: ' . $uuid->getLeastSignificantBits() . "\n";
你得到:
Upper Bits: 12914855512537121056
Lower Bits: 13505861215413436558
使用这些方法您可以获得 Moontoast\Math\BigNumber
对象,因此您可以获得它的值或转换为不同的基数:
$higher = $uuid->getMostSignificantBits();
echo 'Upper Bits 10-base: ' . $higher->getValue() . "\n";
echo 'Upper Bits hex: ' . $higher->convertToBase(16) . "\n";
你得到:
Upper Bits 10-base: 12914855512537121056
Upper Bits hex: b33ac8a9ae454120
您还可以使用已转换为十六进制的 $uuid->getMostSignificantBitsHex()
和 $uuid->getLeastSignificantBitsHex()
。
如果您不想使用其他答案中提到的库,下面的代码将适用于 php 支持 64 位整数的版本。 Java 的 UUID.fromString()
方法就是这样做的。
<?php
PHP_INT_MAX > 2147483647 or exit("Need php version which supports 64-bit integer\n");
$uuid = $argv[1];
$components = explode("-", $uuid);
count($components) == 5 or exit("$uuid is not a valid UUID\n");
$msb = intval($components[0], 16);
$msb <<= 16;
$msb |= intval($components[1], 16);
$msb <<= 16;
$msb |= intval($components[2], 16);
$lsb = intval($components[3], 16);
$lsb <<= 48;
$lsb |= intval($components[4], 16);
echo "UUID: $uuid\n";
echo "MSB: $msb\n";
echo "LSB: $lsb\n";
?>
示例运行:
~ $ php uuid.php b33ac8a9-ae45-4120-bb6e-7537e271808e
UUID: b33ac8a9-ae45-4120-bb6e-7537e271808e
MSB: -5531888561172430560
LSB: -4940882858296115058
这篇repo可能会对您有所帮助。
对于最高有效位 this method, and for least significant bits this method.
我在 PHP 中使用 UUID,我必须查询一个数据库,该数据库将 UUID 的最高有效位和最低有效位存储在两个单独的列中。我找到了
getLeastSignificantBits()
和 getMostSignificantBits()
的等效函数在 PHP 中是什么?谢谢!
编辑:示例数据(如果有帮助):
UUID: b33ac8a9-ae45-4120-bb6e-7537e271808e
...应该转换为...
Upper Bits: -5531888561172430560
Lower Bits: -4940882858296115058
你只需要两个库和 bcmath 扩展, 使用
composer require ramsey/uuid moontoast/math
.
使用Ramsey\Uuid\Uuid
解析UUID:
$uuid = \Ramsey\Uuid\Uuid::fromString('b33ac8a9-ae45-4120-bb6e-7537e271808e');
echo 'Upper Bits: ' . $uuid->getMostSignificantBits() . "\n";
echo 'Lower Bits: ' . $uuid->getLeastSignificantBits() . "\n";
你得到:
Upper Bits: 12914855512537121056
Lower Bits: 13505861215413436558
使用这些方法您可以获得 Moontoast\Math\BigNumber
对象,因此您可以获得它的值或转换为不同的基数:
$higher = $uuid->getMostSignificantBits();
echo 'Upper Bits 10-base: ' . $higher->getValue() . "\n";
echo 'Upper Bits hex: ' . $higher->convertToBase(16) . "\n";
你得到:
Upper Bits 10-base: 12914855512537121056
Upper Bits hex: b33ac8a9ae454120
您还可以使用已转换为十六进制的 $uuid->getMostSignificantBitsHex()
和 $uuid->getLeastSignificantBitsHex()
。
如果您不想使用其他答案中提到的库,下面的代码将适用于 php 支持 64 位整数的版本。 Java 的 UUID.fromString()
方法就是这样做的。
<?php
PHP_INT_MAX > 2147483647 or exit("Need php version which supports 64-bit integer\n");
$uuid = $argv[1];
$components = explode("-", $uuid);
count($components) == 5 or exit("$uuid is not a valid UUID\n");
$msb = intval($components[0], 16);
$msb <<= 16;
$msb |= intval($components[1], 16);
$msb <<= 16;
$msb |= intval($components[2], 16);
$lsb = intval($components[3], 16);
$lsb <<= 48;
$lsb |= intval($components[4], 16);
echo "UUID: $uuid\n";
echo "MSB: $msb\n";
echo "LSB: $lsb\n";
?>
示例运行:
~ $ php uuid.php b33ac8a9-ae45-4120-bb6e-7537e271808e
UUID: b33ac8a9-ae45-4120-bb6e-7537e271808e
MSB: -5531888561172430560
LSB: -4940882858296115058
这篇repo可能会对您有所帮助。 对于最高有效位 this method, and for least significant bits this method.