php実現hash値計算(phpの高精度計算について述べる)


最近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の計算を行うのは難しくありません.