Как подготовить 2 ^ 64 (без знака bigint) для столбца 2 ^ 63-1 (со знаком int), используя PHP? - PullRequest
0 голосов
/ 05 апреля 2020

Мне нужно сохранить число 17557386533328272186 в подписанном столбце bigint.

Postres не поддерживает поля без знака, поскольку спецификация SQL не определяет поля без знака. Таким образом, наибольшее целое число, которое может храниться в столбце Postgres bigint, равно 9223372036854775807.

Если я хочу сохранить значение из этой перцептивной хеширующей библиотеки , мне нужно иметь возможность хранить неподписанное целое число, которое будет регулярно находиться в диапазоне 2 ^ 64.

Мои номера обрабатываются GMP, поэтому решение на основе GMP является хорошим решением.


В итоге я получил следующее:

подписан на неподписанное (sql на работу):
gmp_strval(gmp_add(gmp_init($theirPhash, 10), gmp_pow(2, 63)), 16))

неподписан на подписан (на sql):
gmp_strval(gmp_sub(gmp_init("0x{$fileHash->toHex()}", 16), gmp_pow(2, 63)), 10)

1 Ответ

1 голос
/ 05 апреля 2020

Вычтите 2 ^ 63, прежде чем вставлять в БД, затем добавьте его снова при извлечении:

$max = '9223372036854775807'; // 2^63
$realValue = '17557386533328272186';
$dbValue = gmp_sub($realValue, $max);
var_dump($dbValue);
// INSERT (?), $dbvalue

// Get the value back again
// $dbValue = SELECT dbValue
$realValue = gmp_add($dbValue, $max);
var_dump($realValue);
...