Я работаю с UUID в PHP, и мне нужно запросить базу данных, которая хранит старшие и младшие биты UUID в двух отдельных столбцах. я нашел этот вопрос для Python, это похоже на то, что мне нужно в PHP, но я не знаю, как преобразовать код, и я никогда не был хорош в манипулировании байтами.
Что бы эквивалентные функции для getLeastSignificantBits()
а также getMostSignificantBits()
быть в PHP? Спасибо!
Изменить: Пример данных (если полезно):
UUID: b33ac8a9-ae45-4120-bb6e-7537e271808e
…следует преобразовать в …
Upper Bits: -5531888561172430560
Lower Bits: -4940882858296115058
Вам просто нужны две библиотеки и 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()
которые уже преобразованы в гекс.
Если вы не хотите использовать библиотеку, как указано в другом ответе, приведенный ниже код будет работать с версиями 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
это Сделки рЕПО может помочь вам.
Для наиболее значимых битов Этот метод, и для младших разрядов Этот метод.