最近使用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的計算就不難了。