来自php和javascript的相同功能的两个不同输出

时间:2014-03-23 10:54:22

标签: javascript php hash

我在php和javascript上有一个函数djb2, PHP

function hash_djb2($str){
$hash = 5381;
$length = strlen($str);
for($i = 0; $i < $length; $i++) {
    $hash = (($hash << 5) + $hash) + $str[$i];
}
return $hash;
}

和javascript

djb2Code = function(str){
var hash = 5381;
for (i = 0; i < str.length; i++) {
    char = str.charCodeAt(i);
    hash = ((hash << 5) + hash) + char; /* hash * 33 + c */
}
return hash;
}

在php上我打电话

hash_djb2("123456789egrdhfdtjdtjdtjrt");

,输出

  

-4235984878

并在javascript中调用

djb2Code("123456789egrdhfdtjdtjdtjrt");

,输出

  

27338942

为什么会这样,我该如何解决?

谢谢

2 个答案:

答案 0 :(得分:1)

这些功能不同。您的PHP使用$str[$i],这是字符。您的JavaScript函数使用char.charCodeAt(i)返回整数

像这样更改你的PHP函数......

function hash_djb2($str){
    $hash = 5381;
    $length = strlen($str);
    for($i = 0; $i < $length; $i++) {
        $char = ord($str[$i]);                     // this line is added
        $hash = (($hash << 5) + $hash) + $char;    // this line is modified
    }
    return $hash;
}

答案 1 :(得分:0)

你必须在php代码中使用ord

hash = (($hash << 5) + $hash) + ord($str[$i]);