[英]How to get a 64 bit integer hash from a string in PHP?
我需要 64 位 integer 字符串散列,例如 hash map。
在我看来,好像没有可以返回 64 位整数的本机 PHP hash 功能?
我认为可以将 sha1 hash 的第一部分转换为 integer。 但是,这不会带来最佳性能,而且转换似乎很棘手。
当然,不用安装就可以使用本机 PHP 功能。
我尝试了很多,尤其是将完整的 64 位十六进制字符串转换为有符号的 64 位 integer。 现在我结束了:
function sha1_64bitInt($str) {
$u = unpack('N2', sha1($str, true));
return ($u[1] << 32) | $u[2];
}
性能介于中间。 比实现完整的 hash 算法(如 SimpleHash 或 dbj2)要好得多,并且比对sha1()
或crc32
的裸调用慢得多。
如果有更好的解决方案可以转换为 64 位 integer,则可以在不破坏向后兼容性的情况下改进此 function(我希望)。
有关 md5 hash 的信息,请参阅此页面:
http://us.php.net/manual/en/function.md5.php
这将 output 一个 32 字符的十六进制字符串。 每个十六进制字符代表 4 位数据。 这意味着您需要 16 个十六进制字符(或 md5 哈希的一半)来生成 64 位。
然后,您可以使用 hexdec 将 64 位 (16x4=64) 从 hex 转换为 int。 请注意,如果您传递超过 64 位,则 function 将溢出到浮点类型以尝试表示更大的数字
所以基本上
$stringToHash= "abcdefghijk...";
$hash = md5($stringToHash);
$substring = substr($hash, 0,16);
$finalInt = hexdec($substring);
那应该对你有用。 (但我没有测试过)。
有关 CRC64 实现,请参见http://php.net/manual/ru/function.crc32.php#111699 。
如果没有其他人有更好的主意,您可能可以修改murmurhash_php以非常轻松地调用 64 位版本的MurmurHash3 。
我认为 PHP 不支持 64 位整数。 有一个 BigInteger class (不是原生 PHP),你可以使用(如果你用谷歌搜索的话)。 但它只是在内部使用字符串,而且非常复杂。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.