我正在寻找与 JAVA 等效的 PHP
"SomeString".hashCode();
功能。我正在寻找的 hashCode 应该与 PHP 中用于索引 Hashmap 的 hashCode 相同。我希望你可以帮助我 :)
EDIT:
好的,找到了我正在搜索的函数,它是用 C 编写的,在 PHP 本身中不可用,但感谢您的帮助!
ulong zend_inline_hash_func(char *arKey, uint nKeyLength)
{
ulong $h = 5381;
char *arEnd = arKey + nKeyLength;
while (arKey < arEnd) {
$h += ($h << 5);
$h += (ulong) *arKey++;
}
return $h;
}
Arkh和guiguoz引用的github解决方案方向是正确的,但是都没有考虑到PHP一旦超过2^61就会将整数哈希值上转换为double。 java 函数使用固定硬件 32 位有符号值进行计算,涉及 32 位算术溢出(CPU 固有的)以将该值保持为 32 位有符号整数。
在 PHP 中,每次更新 $hash 时,您都需要手动执行算术溢出:
function overflow32($v)
{
$v = $v % 4294967296;
if ($v > 2147483647) return $v - 4294967296;
elseif ($v < -2147483648) return $v + 4294967296;
else return $v;
}
function hashCode( $s )
{
$h = 0;
$len = strlen($s);
for($i = 0; $i < $len; $i++)
{
$h = overflow32(31 * $h + ord($s[$i]));
}
return $h;
}
(编辑:更正 %v 拼写错误)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)