function password(&$to,$size,$password )
{
$hash_res = array();
$nr = 45345333;
$add = 8;
$nr2 = 0x12345678;
$tmp = 0; if ( $size < 17 )
{
return -1;
}
for ($i=0; $i<strlen($password) ; $i++)
{
if ($password[$i] == ' ' || $password[$i] == "\t")
{
continue;                 /* skipp space in password */
}
$tmp= $password[$i];
$nr ^= ((($nr & 63)+$add)*$tmp)+ ($nr << 8);
$nr2 += ($nr2 << 8) ^ $nr;
$add += $tmp;
}
$hash_res[0] = $nr & ((1 << 31) -1); /* Don't use sign bit (str2int) */;
$hash_res[1] = $nr2 & ((1 << 31) -1);

$to = sprintf("%08x%08x",$hash_res[0],$hash_res[1]);
   return 0;
  
}

解决方案 »

  1.   

    大概写了一下,在这里也没法看
    对了,你那个nr^...不好意思,我的c很烂,也忘了好久
    呵呵,php是不分那种变量的,目前
    变量前面+$就可以了
    剩下和c差不多,类的方面弱点
    function password($to,$size,$password){
            $long hash_res="";
    $nr=45345333L;
            $add=8;
            $nr2=0x12345678L;
    $tmp=0;
            if($size<17){
               return("-1");
    }
    for(;$password;$password++){
    if ($password==''||$password=='\t'){
    continue;                 /* skipp space in password */
    }
    $tmp=$password;
    $nr^= ((($nr&63)+add)$tmp)+($nr<<8);
    $nr2+=($nr2 << 8)^$nr;
    $add+=$tmp;
    }
    $hash_res[0]=nr & (((unsigned long) 1L << 31) -1L); /* Don't use sign bit (str2int) */;
    $hash_res[1]=nr2 & (((unsigned long) 1L << 31) -1L);

    sprintf($to,"%08lx%08lx",$hash_res[0],$hash_res[1]);
       return 0;
      
    }