php実現hash値計算(phpの高精度計算について述べる)
最近phpを用いてhashアルゴリズムを実現し、問題と解決方法は以下の通りである.
1、phpは符号付き整数のみをサポートし、有符号数と無符号数の変換を自分で行う必要がある.
正の整数(64ビット)は対応する数値を格納し、負の数は対応する数値符号化として格納する.
2、phpは符号なし整数の左シフトをサポートしていません.負数の場合は、手動で対応する符号なし数に変更する必要があります.
3、phpはタイプの強転はできません(static_cast)char*という操作を意味します)、バイトコードをintに変換するには、各文字をasciiコード値に変換する必要があります.
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
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の計算を行うのは難しくありません.