PHP应用   

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

时间:2009-12-08 17:58:00

时代在进步,社会在发展,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; }}

 

来源:PHPChina论坛

Notice: Constant RUNTIME already defined in /srv/html/srccn/news/config.php on line 15 Notice: Constant ROOTDIR already defined in /srv/html/srccn/news/config.php on line 16 Notice: Constant SITEDIR already defined in /srv/html/srccn/news/config.php on line 17 Notice: Constant DATAURL already defined in /srv/html/srccn/news/config.php on line 20 Notice: Constant VERSION already defined in /srv/html/srccn/news/system/kernel.php on line 17 Notice: Constant COREDIR already defined in /srv/html/srccn/news/system/kernel.php on line 18 Fatal error: require(): Cannot redeclare class mysql in /srv/html/srccn/news/system/kernel.php on line 22