这个程序是一个字符串HASH算法。但是
<?
define ("CONSTANT",0x62531965);
function moveleft19($val)
{
$shift = 19;
$shift &= 0x1f;
$val = (($val>>(0x20 - $shift))&524287) | ($val << $shift);
return $val;
}
$serverName="i love you you love me too?";
$hServer=0; for($i=0;$i<strlen($serverName);$i++){
$hServer += moveleft19($tmp)+ord($serverName[$i]);
}
$hServer += $hServer * 0x62531965;
?>这样一个程序,是从C上移植过来的。但是用PHP实现的时候却发现,在不同的PHP版本上,结果不一样,同一个PHP上,不同的访问,结果也不一样。
后来逐步排除,认为是整数溢出造成的,因为PHP上没有unsigned int 这个类型,所以,当数值达到2147483647之后再进行的运算,结果就很不确定了。
moveleft19是对一个int型的数字进行循环移动,这个经测试是没有问题的。
请问下大家该怎么处理,谢谢了!
<?
define ("CONSTANT",0x62531965);
function moveleft19($val)
{
$shift = 19;
$shift &= 0x1f;
$val = (($val>>(0x20 - $shift))&524287) | ($val << $shift);
return $val;
}
$serverName="i love you you love me too?";
$hServer=0; for($i=0;$i<strlen($serverName);$i++){
$hServer += moveleft19($tmp)+ord($serverName[$i]);
}
$hServer += $hServer * 0x62531965;
?>这样一个程序,是从C上移植过来的。但是用PHP实现的时候却发现,在不同的PHP版本上,结果不一样,同一个PHP上,不同的访问,结果也不一样。
后来逐步排除,认为是整数溢出造成的,因为PHP上没有unsigned int 这个类型,所以,当数值达到2147483647之后再进行的运算,结果就很不确定了。
moveleft19是对一个int型的数字进行循环移动,这个经测试是没有问题的。
请问下大家该怎么处理,谢谢了!
或者
sprintf('%u',$int)来表示非符合整数
楼上的方法只能打印不能运算~