Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript和php中的函数相同,但输出不同_Php_Javascript_Hash - Fatal编程技术网

javascript和php中的函数相同,但输出不同

javascript和php中的函数相同,但输出不同,php,javascript,hash,Php,Javascript,Hash,我在javascript中有这个函数,可以正常工作 // javascript function myhash(str) { var hash = 0; if (str.length == 0) return hash; for (var i = 0; i < str.length; i++) { oneChar = str.charCodeAt(i); hash = ((hash << 5) - ha

我在javascript中有这个函数,可以正常工作

// javascript
    function myhash(str) {
      var hash = 0;
      if (str.length == 0) return hash;
      for (var i = 0; i < str.length; i++) {
        oneChar = str.charCodeAt(i);
        hash = ((hash << 5) - hash) + oneChar;
        hash &= hash;
      }
      return hash;
    }
有人知道问题出在哪里吗?它们看起来相同,但显然不同。

是我用hash1测试的php的保留函数,两者都提供相同的结果

使用测试:

PHP结果:3556498


Javascript:3556498

在Javascript中,在第6次迭代中使用字符串“example”,
$hash的结果
你能给出一个例子吗?可能有助于确定problem@Ian不过,如果知道有什么不同,那就好了。如果我是在这种情况下,我会在整个代码中放置
echo
s等等,看看差异首先出现在哪里不要忘记将示例更改为使用MyHash有两个很好的工具来显示您的问题-这将允许我们在第六次迭代中使用字符串测试和帮助调试JavaScript例如,
$hash的结果这两个函数的实名不同于“hash”,我写了“hash”“只是为了这个目的。对不起,这不是JS中整数的最大值。它是使用位运算符处理的数字的最大值。如果您坚持使用普通的数学运算符,则可以执行
96947249*32
并获得“正确”的值。@Alnitak MDN文档说
所有按位运算符的操作数都转换为有符号32位整数
。然后继续说
数字-2147483648和2147483647是可通过32位有符号数字表示的最小和最大整数。
您使用该操作指的是
数字,这是不同的。但你的观点是正确的;我将更新我的答案Kinda-a
Number
仍然可以准确地表示最多2^52的任何整数。逐位运算符除去前32位以外的任何位,但结果值仍然是一个
数字
@Alnitak我明白你的意思,我想我只是在拐弯抹角-重点是操作数转换为有符号32位整数。否则,
Number
操作最多可以计算
Number.MAX\u值
。顺便说一句,答案不错,有一个补丁:)确认了,它甚至可以用于我测试的其他输入。。。非常感谢大家。我觉得它应该在32位版本的PHP上工作,因为您正在将它“限制”到32位,不是吗?对不起,如果我误解了你的意思code@Sylar我发现一些不一致,因为我的
&
运算符没有正确设置符号位。如果将
&0x7fffffff
添加到最终的
返回
(在两个版本中)以确保结果未签名,效果会更好。因此返回部分应该是“return($hash&0x7fffff)”?但是这个“$tmp=($hash@Sylar是的,没错。当然,这也会改变你现有的JS哈希代码。
// php
      function myhash($str) {
        $hash = 0;
        if (strlen($str) == 0) return $hash;
        for ($i = 0; $i < strlen($str); $i++) {
          $oneChar = ord($str[$i]);
          $hash = (($hash << 5) - $hash) + $oneChar;
          $hash &= $hash;
        }
        return $hash;
      }
console.log(myhash("example")); // output: -1322970774
echo myhash("example"); // output: 93166309738
function myhash($str) {
  $hash = 0;
  if (strlen($str) == 0) return $hash;
  for ($i = 0; $i < strlen($str); $i++) {
    $oneChar = ord($str[$i]);
    $tmp = ($hash << 5) & 0xffffffff;
    $hash = ($tmp - $hash) + $oneChar;
  }
  return $hash;
}