時代在進步,社會在發展,64位機的出現導致移位元算不再很輕易溢出,這固然是件值得高興的事情,可在系統遷移中,忽然發現64位機器hash函數得出的結果居然與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; }}
http://www.bkjia.com/PHPjc/735127.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/735127.htmlTechArticle時代在進步,社會在發展,64位機的出現導致移位元算不再很輕易溢出,這固然是件值得高興的事情,可在系統遷移中,忽然發現64位機器...