好日子,我正在做哈希algorthm,所以我正在从PHP重写它到C++。 但C++中的结果与php结果不同。 PHP结果包含超过10个字符,C++结果只有6 - 8个字符。但PHP结果的最后8个字符与C++结果相同。 因此,这里是PHP代码:相同的算法,不同的结果
<?php function JL1($text) {
$text.="XQ";
$length=strlen($text);
$hash=0;
for($j=0;$j<$length;$j++) {
$p=$text[$j];
$s=ord($p);
if($s%2==0) $s+=9999;
$hash+=$s*($j+1)*0x40ACEF*0xFF;
}
$hash+=33*0x40ACEF*0xFF;
$hash=sprintf("%x",$hash);
return $hash; } ?>
在这里,C++代码:
char * JL1(char * str){
int size=(strlen(str)+3),s=0; //Edit here (+2 replaced with +3)
if(size<=6) //Edit here (<9 replaced with <=6)
size=9;
char *final=new char[size],temp;
strcpy(final,str);
strcat(final,"XQ");
long length=strlen(final),hash=0L;
for(int i=0;i<length;i++){
temp=final[i];
s=(int)temp;
if(s%2==0)s+=9999;
hash+=((s)*(i+1)*(0x40ACEF)*(0xFF));
}
hash+=33*(0x40ACEF)*(0xFF);
sprintf(final,"%x",hash); //to hex string
final[8]='\0';
return final; }
的C++导致了字例: “嗨!” :053c81be 和PHP结果这个词:324C 053c81be
有谁知道,这里是错误,如何解决这个问题,无论是在PHP或CPP代码? 顺便说一句,当我在php结果中剪掉那些第一个字母时,我得到了C++结果,但它不会帮助,因为C++结果不是8个字符长,在某些情况下可能只有6个字符长。
C++中的“long hash”很可能仅限于您平台上的32位。 PHP的号码不是。在'$ hash'的每次修改之后,尝试执行'$ hash =($ hash&0xFFFFFFFF);'。 – DCoder 2012-07-26 12:41:10
@DCOder,nope,我在64位平台上得到了相同的结果。 – SingerOfTheFall 2012-07-26 12:43:18
它的工作原理,但以防万一,当C + +哈希是8个字符长。 当它散列为“asdf”时,C++:20205e中的结果长度为6个字符,但在PHP中它的长度为9个字符:10020205e – jakubinf 2012-07-26 12:46:32