Мне нужны 64-битные целые хэши строк для чего-то вроде хэш-карты.
Мне кажется, что нет встроенной хеш-функции PHP, которая может возвращать 64-битные целые числа?
Я думаю, что можно взять первую часть хэша sha1 и преобразовать его в целое. Однако это не принесет лучших результатов, и преобразование кажется сложным.
Конечно, было бы неплохо использовать собственные PHP-функции без установки.
См. Эту страницу для информации о хеше md5:
http://us.php.net/manual/en/function.md5.php
Это выведет шестнадцатеричную строку с 32 символами. Каждый шестнадцатеричный символ представляет собой 4 бита данных. это означает, что вам нужно 16 шестнадцатеричных символов (или половина хеша md5) для генерации 64 бит.
вы можете использовать hexdec для преобразования 64 бит (16×4 = 64) из hex в int. Обратите внимание, что если вы используете более 64 бит, функция будет переполняться в тип float, чтобы попытаться представить большее число
Итак, в основном
$stringToHash= "abcdefghijk..."; $hash = md5($stringToHash); $substring = substr($hash, 0,16); $finalInt = hexdec($substring);
Это должно сработать для вас. (но я его не тестировал).
Я пробовал много, особенно для преобразования полной 64-разрядной шестнадцатеричной строки в подписанное 64-битное целое число. Теперь я закончил с этим:
function sha1_64bitInt($str) { $u = unpack('N2', sha1($str, true)); return ($u[1] << 32) | $u[2]; }
Производительность находится где-то посередине. Намного лучше, чем реализация полного алгоритма хеширования (например, SimpleHash или dbj2) и намного медленнее, чем голый вызов sha1()
или crc32
.
Когда будет лучшее решение для преобразования в 64-битное целое число, можно будет улучшить эту функцию, не нарушая обратной совместимости (надеюсь).
Если у кого-то еще нет лучшей идеи, вы можете, вероятно, изменить murmurhash_php, чтобы очень легко вызвать 64-битную версию MurmurHash3 .
Думаю, PHP не поддерживает 64-битные целые числа. Существует класс BigInteger (не родной PHP), который вы могли бы использовать (и найти, действительно ли у вас Google действительно хорошо). Но он просто использует строки внутри, и это комплекс hella.
См. http://php.net/manual/ru/function.crc32.php#111699 для реализации CRC64.