php - javascript 和 php 中的功能相同,但输出不同

标签 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) - hash) + oneChar;
        hash &= hash;
      }
      return hash;
    }

我正在尝试将此函数重写为 PHP,但对于相同的输入给出与 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

有谁知道,问题出在哪里?它们看起来一样,但显然它们不是。

最佳答案

<< Javascript 中的运算符将数字参数转换为 32 位有符号整数,而不是 IEEE 754 double 。

要修复您的 PHP 代码,您(至少)需要屏蔽 << 的结果。在你对它做任何其他事情之前进行操作。

下面的代码产生与在(64 位)MacOS X 10.8.4 上使用 PHP 5.3.15 输入“example”的 JS 代码相同的结果。它可能不适用于其他测试用例,或不适用于 32 位版本的 PHP:

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;
}

注意:$hash &= $hash 行是一个空操作。与自身“与”的数字将产生相同的数字。

关于php - javascript 和 php 中的功能相同,但输出不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17709003/

相关文章:

java - Rabin-Karp 哈希码太大

php - 如何从表格中的每个不同类别中选择三行?

php - 将 json_encode 应用于类时如何忽略特定值

java - 数据库连接功能在 PHP 中实现

arrays - Perl:如果值数组相交,则打印 2 个哈希值中的键

asp.net - 使用 Python 对 ASP.NET 角色/成员身份创建的数据库中的原始用户名、散列、盐进行身份验证

php - 仅从 for 循环中的第二项添加显示属性

javascript - 通过 CSS/javascript 对 div 的模糊效果?

javascript - 检查数组值是否全部不同

javascript - 查找客户的大致物理位置