PHP两个不同的结果是localhost和来自一个函数的live host

时间:2016-05-11 02:06:37

标签: php

我不知道为什么我从同一个函数得到两个不同的结果,当我在本地主机中使用它时我得到一个结果,当我将文件上传到我的主机时,我得到不同的结果。 我测试它,我给它相同的单词,我得到两个不同的结果。 它是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;
}

2 个答案:

答案 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个字母才能中断。 你的选择:

  1. 将您的CAPTCHA限制为3个字符或更少,并使用 现有功能。

  2. 使用$hash << 3转换。这将使你5 人物

  3. 使用$hash << 2转换。这将使你7 人物

  4. 使用其他方法

  5. 例如:

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