最近使用php实现一个hash算法,问题和解决方法如下:
1、php只支持有符号整数,需要自己进行有符号数与无符号数的转换。
正整数(64位)存储的是对应数值,负数存储为对应数值补码。
function StrToInt($str) {
if (bccomp($str, '9223372036854775808') >= 0) {
$str = bcsub('18446744073709551616', $str);
$str = "-" . $str;
} else if (bccomp($str, '-9223372036854775808') < 0) {
$str = bcadd('18446744073709551616', $str);
}
return (int)$str;
}
2、php不支持无符号整数左移,如果为负数,需手动转为对应无符号数。
3、php不能进行类型强转(我的意思是(static_cast )char* 这样的操作),如果要将字节码转为int,需要将每个字符转换为ascii码值。
function AddFor64A($data) {
$sum = bcadd((string)(ord($data[0])), (string)(ord($data[1]) << 8));
$sum = bcadd($sum, (string)(ord($data[2]) << 16));
$sum = bcadd($sum, (string)(ord($data[3]) << 24));
$sum = bcadd($sum, (string)(ord($data[4]) << 32));
$sum = bcadd($sum, (string)(ord($data[5]) << 40));
$sum = bcadd($sum, (string)(ord($data[6]) << 48));
$sum = bcadd($sum, (string)(ord($data[7]) << 56));
return $this->StrToInt($sum);
}以后问题弄明白了,进行hash的计算就不难了。