PHP内部hashCode函数

use*_*911 5 php

我正在寻找JAVA的PHP equelent

 "SomeString".hashCode();
Run Code Online (Sandbox Code Playgroud)

功能.我正在寻找的hashCode应该与用于在PHP中索引Hashmaps的相同.我希望你能帮帮我 :)

编辑:

好的,发现我正在寻找用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;
}
Run Code Online (Sandbox Code Playgroud)

小智 7

Arkh和guiguoz引用的github解决方案是正确的方向,但两者都没有考虑到PHP一旦超过2 ^ 61就会将整数哈希值上转换为double.使用固定硬件32位有符号值计算的java函数涉及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;
}
Run Code Online (Sandbox Code Playgroud)

(编辑:更正%v错字)

  • overflow32方法是错误的(%v而不是$ v,它在32位机器上除以0).相反,$ h =行应该是:`$ h =(int)(31*$ h + ord($ s [$ i]))&0xffffffff;` (4认同)
  • 是否可以用&amp;&amp; 0x7FFFFFFF`替换overflow32()?还是会有其他问题? (2认同)