ホームページ >バックエンド開発 >PHPチュートリアル >32 ビットと 64 ビットの両方のマシンと互換性のある PHP ハッシュ関数_PHP チュートリアル

32 ビットと 64 ビットの両方のマシンと互換性のある PHP ハッシュ関数_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:38:06833ブラウズ

時代は進み、64ビットマシンの登場によりシフト計算がオーバーフローしにくくなったのは確かに嬉しいことですが、システム移行中に突然ハッシュ関数が発見されました。 64 ビット マシンの結果は 32 ビットとは実際には異なりました。私はショックを受けてすぐにアルゴリズムを調べたところ、シフト演算の符号に問題があることがわかりました。
システムを判断して64ビットマシン用にアルゴリズムを書き直すしかありませんでした。コードは次のとおりです:

if (exec("getconf LONG_BIT") == "32") {
 function _hash($apszData = "", $MAX_TABLE_NUM = 0) {
  $_hash = $x = $i = 0;
  for($i = 0; $i < strlen($apszData); $i++) {
   $_hash = ($_hash << 4) + ord($apszData[$i]);
   if (($x = $_hash &0xF0000000) != 0) {
    $_hash ^= ($x >> 24);
    $_hash &= ~$x;
   }
  }
  return ($_hash &0x7FFFFFFF) % $MAX_TABLE_NUM + 1;
 }
} else {
 function _hash($apszData = "", $MAX_TABLE_NUM = 0) {
  $hash = $x = $i = 0;
  for($i = 0; $i < strlen($apszData); $i++) {
   $hash = ($hash << 4) + ((ord($apszData[$i])) << 32);
 
   if (($x = $hash &0xF000000000000000) != 0) {
    $hash ^= $x >> 24;
    $hash &= (~$x) &0xFFFFFFFF00000000;
   }
  }
 
  $ret = ($hash &0x7FFFFFFF00000000) % ($MAX_TABLE_NUM << 32) + (1 << 32);
  $ret >>= 32;
  $ret &= 0xFFFFFFFF;
  return $ret;
 }
}

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/735127.html技術記事時代が進み、社会が発展し、64ビットマシンの登場でシフト計算が簡単にオーバーフローしなくなったのは確かに喜ばしいことですが、システム移行中に突然64ビットマシンが発見されてしまいました…。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。