PHP 的位移運算在 32 位與 64 位系統上行為不同:32 位整數溢出會自動轉浮點,而 64 位不溢出。導致相同哈希算法在不同架構產生不同結果,影響分布式路由一致性。
<?php
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;
}
}
?>
exec("getconf LONG_BIT") 獲取系統位數(需確保執行權限)。0xF0000000、0x7FFFFFFF。適用於跨架構部署的分表分庫、Consistent Hashing 節點選擇等對哈希一致性要求高的場景。