我在PHP中有一个散列函数,它是Java散列函数的一个端口。在我的32位上,函数匹配。但是,在64位操作系统上运行PHP代码时,结果会发生变化。
无论如何,我可以独立于架构执行算术运算,就好像它们总是在32位系统上执行一样?
这是我的散列函数:
function numericHash( $text, $lessThan = 50 )
{
$hash = 0;
for ( $i = 0; $i < strlen( $text ); $i++ ) {
$b = ord( $text[ $i ] );
$hash += $b;
$hash = intval( $hash );
$hash += ( $hash << 10 );
$hash = intval( $hash );
$hash ^= ( $hash >> 6 );
$hash = intval( $hash );
}
$hash += ( $hash << 3 );
$hash = intval( $hash );
$hash ^= ( $hash >> 11 );
$hash = intval( $hash );
$hash += intval( $hash << 15 );
$hash = intval( $hash );
return bcmod( (string) abs( $hash ), (string) $lessThan );
}
答案 0 :(得分:1)
在编译为64的php上,移位运算符的行为不同,因为在32位上PHP_MAX_INT值为0xFFFFFFFFFFFF
而不是0xFFFFFFFF
。
function lshift32($num, $steps) {
// 64 bit
if (PHP_INT_MAX >= 0x7FFFFFF) {
if ($num < 0) {
// set 32bit signed bit
$num = $num | 0x80000000;
}
$num = ($num << $steps) & 0xFFFFFFFF;
if (($num & 0x80000000) == 0x80000000) {
$num = $num | 0xFFFFFFFF00000000;
}
return $num;
}
else
{
return $num << $steps;
}
}
答案 1 :(得分:0)
我的解决方案是使用以下函数代替intval
function intval32bits($value)
{
$value = ($value & 0xFFFFFFFF);
if ($value & 0x80000000)
$value = -((~$value & 0xFFFFFFFF) + 1);
return $value;
}