首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

兼容 32 位與 64 位系統的 PHP 哈希函數實現

     編輯:PHP 相關知識

問題背景

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") 獲取系統位數(需確保執行權限)。
  • 32 位分支採用經典 ELF 哈希邏輯,掩碼 0xF0000000、0x7FFFFFFF。
  • 64 位分支將字符擴展至高 32 位參與運算,掩碼擴展至 64 位,最終結果右移 32 位取低 32 位,保證返回值範圍一致。
  • 兩分支函數簽名相同,業務代碼無感調用。

應用場景

適用於跨架構部署的分表分庫、Consistent Hashing 節點選擇等對哈希一致性要求高的場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved