我不知道为什么我从同一个函数得到两个不同的结果,当我在本地主机中使用它时我得到一个结果,当我将文件上传到我的主机时,我得到不同的结果。 我测试它,我给它相同的单词,我得到两个不同的结果。 它是CAPTCHA库中的一个函数:Captcha library
function rpHash($value) {
$hash = 5381;
$value = strtoupper($value);
for($i = 0; $i < strlen($value); $i++) {
$hash = (($hash << 5) + $hash) + ord(substr($value, $i));
}
return $hash;
}
答案 0 :(得分:1)
这可能与操作系统是32位还是64位有关。如果你将$ hash转移得太远,你可能最终会出现溢出错误,并回绕到负数。
解决方案取决于您的需求。如果你只需要一个正整数,并且如果值在操作系统中是一致的并不重要,只需用abs()包装返回的值,以确保结果为正。
如果您需要结果始终保持一致,则可能需要截断结果以最多32位存储。使用类似的东西:
$32bitresult = rphash($value) & 0xFFFFFFFF;
应该有用。
注意:您可能需要添加一项检查,以便在对两者进行AND运算之前查看rphash的结果是否为负。
看看这个类似的问题/答案:
Force PHP integer overflow
我还没有能够测试代码,但也许它至少可以帮助你。
答案 1 :(得分:1)
问题是您的localhost是32位,主机是64位。要了解原因,请阅读this post上接受的答案。总结一下:
&lt;&lt; 运算符执行左移
整数在内存中存储为一系列位。例如,存储为32位int的数字6将在基数2中表示为:
00000000 00000000 00000000 00000110
将该位模式向左移位一位(6 <1)将导致数字12并在基数2中表示为:
00000000 00000000 00000000 00001100
如您所见,数字向左移动了一个位置,右边的最后一个数字用零填充。
向左移动时,每个班次的数量增加^ 2。
在32位系统上,你可以拥有的最大整数是2,147,483,647(这是01111111 11111111 11111111 11111111(有31位可用)。这就是你在离开商店之前需要转移多少空间数字。
5381的起始散列长度为13位 您的函数会为$ value中的每个字母移动五位。 在3个字母(3 * 5)+ 13 = 28
之后得到31位所以你的CAPTCHA最多只能有3个字母才能中断。 你的选择:
将您的CAPTCHA限制为3个字符或更少,并使用 现有功能。
使用$hash << 3
转换。这将使你5
人物
使用$hash << 2
转换。这将使你7
人物
使用其他方法
例如:
function rpHash($value) {
$hash = 5381;
$value = strtoupper($value);
for($i = 0; $i < strlen($value); $i++) {
$hash = (($hash << 2) + $hash) + ord(substr($value, $i));
}
return $hash;
}