最近使用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 <int>)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的计算就不难了。