ホームページ >バックエンド開発 >PHPチュートリアル >32 ビットと 64 ビットの両方のマシンと互換性のある PHP ハッシュ関数_PHP チュートリアル
時代は進み、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; } }