Php 相同的算法,不同的结果 >代替char数组。 从哪里开始……/P> 数据类型在C或C++中没有固定的保证大小。因此, HAS< 可能会溢出每次迭代,或者可能永远不会这样做。
从哪里开始 <>数据类型在C或C++中没有固定的保证大小。因此,Php 相同的算法,不同的结果 >代替char数组。 从哪里开始……/P> 数据类型在C或C++中没有固定的保证大小。因此, HAS< 可能会溢出每次迭代,或者可能永远不会这样做。,php,c++,hash,Php,C++,Hash,从哪里开始 数据类型在C或C++中没有固定的保证大小。因此, HAS< 可能会溢出每次迭代,或者可能永远不会这样做。 chars可以是signed或unsigned,因此,将一个字符转换为整数可能会导致同一字符在不同实现中出现负值和正值 将哈希值打印到final中时,您可能写入的内容超过了final的结尾。当将第9个字符设置为0时,您也可能过早地将字符串截断 如果str长度至少为7个字符,则strcat将写入final的末尾 s,一个相对短暂的临时变量,声明得太早了。与temp相同 您的代码看起
char
s可以是signed
或unsigned
,因此,将一个字符转换为整数可能会导致同一字符在不同实现中出现负值和正值
将哈希值
打印到final
中时,您可能写入的内容超过了final
的结尾。当将第9个字符设置为0时,您也可能过早地将字符串截断
如果str
长度至少为7个字符,则strcat
将写入final
的末尾
s
,一个相对短暂的临时变量,声明得太早了。与temp
相同
您的代码看起来非常拥挤,几乎没有空格,而且很难阅读
表达式“33*(0x40ACEF)*(0xFF)
”溢出;您的意思是0x4DF48431L
在C++中处理字符串时,考虑使用<代码> STD::String < /C> >代替char数组。
从哪里开始……/P>
<>数据类型在C或C++中没有固定的保证大小。因此,
s可以是char
或signed
,因此,将一个字符转换为整数可能会导致同一字符在不同实现中出现负值和正值unsigned
哈希值
打印到final
中时,您可能写入的内容超过了final
的结尾。当将第9个字符设置为0时,您也可能过早地将字符串截断
如果str
长度至少为7个字符,则strcat
将写入final
的末尾
s
,一个相对短暂的临时变量,声明得太早了。与temp
相同
您的代码看起来非常拥挤,几乎没有空格,而且很难阅读
表达式“33*(0x40ACEF)*(0xFF)
”溢出;您的意思是0x4DF48431L
在C++中使用字符串时,考虑使用<代码> STD::String < /C>代替Car数组。
这里似乎有一个bug…
int size=(strlen(str)+2),s=0;
if(size<9)
size=9;
char *final=new char[size],temp;
strcpy(final,str);
strcat(final,"XQ");
int size=(strlen(str)+2),s=0;
如果(大小这里似乎有一个bug
int size=(strlen(str)+2),s=0;
if(size<9)
size=9;
char *final=new char[size],temp;
strcpy(final,str);
strcat(final,"XQ");
int size=(strlen(str)+2),s=0;
如果(尺寸)
C++中的长散列
sprintf(最终,“%x”,散列)
产生一个可能不正确的结果。%x
将参数解释为无符号int
,在Windows和Linux x64上都是32位。因此它将长
解释为无符号int
,如果长
超过32位,则结果将被截断$hash&=0xFFFFFFFF;
如果你夹取最终值,PHP代码将产生与X64 Linux上的C++代码相同的结果(这意味着中间结果的64位整数)。
如果在每次计算之后都将其夹紧,则应该得到与C++代码在32位平台或Windows X64(中间结果的32位整数)相同的结果。
C++中的长散列很可能只限于平台上的32位。PHP的编号不是。
sprintf(最终,“%x”,散列)
产生一个可能不正确的结果。%x
将参数解释为无符号int
,在Windows和Linux x64上都是32位。因此它将长
解释为无符号int
,如果长
超过32位,则结果将被截断$hash&=0xFFFFFFFF;
如果你夹取最终值,PHP代码将产生与X64 Linux上的C++代码相同的结果(这意味着中间结果的64位整数)。
如果在每次计算后都将它夹在一起,则应该得到与C++代码在32位平台或Windows X64(中间结果的32位整数)相同的结果。C++中的
<代码>长哈希< /C> >很可能局限于平台上的32位。PHP的编号不是。尝试执行<代码> $Hash =($Hash和0xfffffffff)在<代码> $ash Hash <代码> > DCOder,NoPE,我在64位平台上得到相同的结果。它工作,但在情况下,当C++哈希是8个字符长时。,结果在C++:20205e中为6个字符长,但在PHP中为9个字符长:10020205e@SingerOfTheFall:您是在Linux x64上还是在Linux x64上?很有意思。我认为(主要)问题在于sprintf(final,“%x”,hash)
%x
将参数解释为无符号int,在Windows和Linux x64上都是32位。因此,它将长的解释为无符号int
,这样做会截断可见结果。在我看来,如果钳制最后的val