PHP-эквивалент getLeastSignificantBits () & amp; getMostSignificantBits из Java?

Я работаю с UUID в PHP, и мне нужно запросить базу данных, которая хранит старшие и младшие биты UUID в двух отдельных столбцах. я нашел этот вопрос для Python, это похоже на то, что мне нужно в PHP, но я не знаю, как преобразовать код, и я никогда не был хорош в манипулировании байтами.

Что бы эквивалентные функции для getLeastSignificantBits() а также getMostSignificantBits() быть в PHP? Спасибо!

Изменить: Пример данных (если полезно):

UUID: b33ac8a9-ae45-4120-bb6e-7537e271808e

…следует преобразовать в …

Upper Bits: -5531888561172430560
Lower Bits: -4940882858296115058

2

Решение

Вам просто нужны две библиотеки и BCMath расширение,
с помощью

composer require ramsey/uuid moontoast/math,

Разобрать UUID используя Ramsey\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() которые уже преобразованы в гекс.

3

Другие решения

Если вы не хотите использовать библиотеку, как указано в другом ответе, приведенный ниже код будет работать с версиями 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
1

это Сделки рЕПО может помочь вам.
Для наиболее значимых битов Этот метод, и для младших разрядов Этот метод.

0
По вопросам рекламы [email protected]