Php 相同的算法,不同的结果 >代替char数组。 从哪里开始……/P> 数据类型在C或C++中没有固定的保证大小。因此, HAS< 可能会溢出每次迭代,或者可能永远不会这样做。

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相同 您的代码看起

从哪里开始

<>数据类型在C或C++中没有固定的保证大小。因此, HAS< <代码>可能会溢出每次迭代,或者可能永远不会这样做。
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++中没有固定的保证大小。因此, HAS< <代码>可能会溢出每次迭代,或者可能永远不会这样做。

char
s可以是
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++中的长散列很可能只限于平台上的32位。PHP的编号不是。

  • sprintf(最终,“%x”,散列)
    产生一个可能不正确的结果。
    %x
    将参数解释为
    无符号int
    ,在Windows和Linux x64上都是32位。因此它将
    解释为
    无符号int
    ,如果
    超过32位,则结果将被截断

  • 查看aib提出的所有问题,尤其是提前终止结果

  • 您需要自己处理第三点,但我可以回答前两点。您需要将结果钳制为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位,则结果将被截断

  • 查看aib提出的所有问题,尤其是提前终止结果

  • 您需要自己处理第三点,但我可以回答前两点。您需要将结果钳制为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