我正在寻找JAVA的PHP equelent
"SomeString".hashCode();
功能。我正在寻找的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;
}
答案 0 :(得分: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;
}
(编辑:更正%v错字)
答案 1 :(得分:3)
php中没有这样的方法。所以你必须实现正确的方法。 Wikipedia给出了我认为的字符串使用的Java.lang.hashCode使用的算法,所以这里有一个快速的php版本:
<?php
function getStringHashCode($string){
$hash = 0;
$stringLength = strlen($string);
for($i = 0; $i < $stringLength; $i++){
$hash = 31 * $hash + $string[$i];
}
return $hash;
}
答案 2 :(得分:1)
spl_object_hash可能是最接近你想要的,但是尽管名称它并没有真正返回传入值的哈希值,但它只是一个内部唯一标识符。我不知道它是否是数组等引擎盖下实际使用的哈希值。
答案 3 :(得分:1)
这是我在PHP中实现Java的hashCode的2美分:
/**
* Simulates java hashCode function
* hash a string to 32 bit
* @param str the string to hash
* @return hashed 32 bit integer
*/
function hashCode($str) {
$str = (string)$str;
$hash = 0;
$len = strlen($str);
if ($len == 0 )
return $hash;
for ($i = 0; $i < $len; $i++) {
$h = $hash << 5;
$h -= $hash;
$h += ord($str[$i]);
$hash = $h;
$hash &= 0xFFFFFFFF;
}
return $hash;
};
答案 4 :(得分:-1)
支持表情符号的utf-8版本
function str_hashcode($s){
$hash = 0;
$len = mb_strlen($s, 'UTF-8');
if($len == 0 )
return $hash;
for ($i = 0; $i < $len; $i++) {
$c = mb_substr($s, $i, 1, 'UTF-8');
$cc = unpack('V', iconv('UTF-8', 'UCS-4LE', $c))[1];
$hash = (($hash << 5) - $hash) + $cc;
$hash &= $hash; // 16bit > 32bit
}
return $hash;
}