Как получить 64-х битное целое число из строки в PHP? - PullRequest
3 голосов
/ 11 июня 2011

Мне нужны 64-битные целочисленные хэши строк для чего-то вроде хэш-карты.

Мне кажется, что нет встроенной функции хэширования PHP, которая может возвращать 64-битные целые числа?

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

Конечно, было бы неплохо использовать встроенные функции PHP без установок.

Ответы [ 5 ]

4 голосов
/ 11 июня 2011

Я много пробовал, особенно для преобразования полной 64-битной шестнадцатеричной строки в 64-битное целое число со знаком. Теперь я закончил с этим:

function sha1_64bitInt($str) {
    $u = unpack('N2', sha1($str, true));
    return ($u[1] << 32) | $u[2];
}

Производительность где-то посередине. Намного лучше, чем реализация алгоритма полного хэширования (например, SimpleHash или dbj2), и намного медленнее, чем простой вызов sha1() или crc32.

Когда когда-нибудь будет лучшее решение для преобразования в 64-разрядное целое число, можно будет улучшить эту функцию без нарушения обратной совместимости (я надеюсь).

3 голосов
/ 11 июня 2011

См. Эту страницу для получения информации о хэше md5:

http://us.php.net/manual/en/function.md5.php

Это выведет шестнадцатеричную строку из 32 символов.Каждый шестнадцатеричный символ представляет 4 бита данных.это означает, что вам нужно 16 шестнадцатеричных символов (или половина хеша md5) для генерации 64 битов.

затем вы можете использовать hexdec для преобразования 64 бит (16x4 = 64) из шестнадцатеричного в целое.Обратите внимание, что если вы наберете более 64 бит, функция будет переполнена до типа с плавающей точкой, чтобы попытаться представить большее число

http://php.net/hexdec

Таким образом, в основном

$stringToHash= "abcdefghijk...";
$hash = md5($stringToHash);
$substring = substr($hash, 0,16);
$finalInt = hexdec($substring);

Тодолжен работать на вас.(но я не проверял это).

0 голосов
/ 17 февраля 2015

См. http://php.net/manual/ru/function.crc32.php#111699 для реализации CRC64.

0 голосов
/ 11 июня 2011

Я думаю, что PHP не поддерживает 64-битные целые числа.Существует класс BigInteger (не нативный PHP), который вы можете использовать (и найти, если вы действительно хорошо Google).Но он просто использует строки внутри, и это сложный комплекс.

0 голосов
/ 11 июня 2011

Если у кого-то нет идеи получше, вы, вероятно, можете изменить murmurhash_php , чтобы довольно легко вызывать 64-битную версию MurmurHash3 .

...