javascript和php中的函数相同,但输出不同
我在javascript中有这个函数,可以正常工作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
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-aNumber
仍然可以准确地表示最多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;
}