Home >php教程 >php手册 >同时兼容32位与64位机器的php hash函数

同时兼容32位与64位机器的php hash函数

WBOY
WBOYOriginal
2016-06-13 09:42:41859browse

时代在进步,社会在发展,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;
 }
}
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn