JS欺骗了我吗?希望在C中实现与在Javascript中相同的哈希吗

JS欺骗了我吗?希望在C中实现与在Javascript中相同的哈希吗,javascript,c,hash,Javascript,C,Hash,我在Javascript中有一个函数,可以从字符串生成哈希,在PHP中有相同的函数,可以生成相同的值,但在C中没有。我想这和类型有关,但我不知道如何解决这个问题。我花了好几个小时在这上面 javascript函数很简单(我认为是从Java复制的): 在应用新哈希值(在while循环中)后添加一些调试输出后,我得到以下表格: C/C++ JS --------------- ----------------- 77 7

我在Javascript中有一个函数,可以从字符串生成哈希,在PHP中有相同的函数,可以生成相同的值,但在C中没有。我想这和类型有关,但我不知道如何解决这个问题。我花了好几个小时在这上面


javascript函数很简单(我认为是从Java复制的):

在应用新哈希值(在while循环中)后添加一些调试输出后,我得到以下表格:

C/C++               JS
---------------         -----------------
77                  77
2445                2445
75842               75842
2351179             2351179
72886654            72886654
-2035480916         -2035480916
1324601154          1324601154
-1887037154         -1887037154
1631390447          1631390447
-966503578          -966503578
103160276           103160276
-1096998635         -1096998635
352780784           352780784
-1948697477         -1948697477
-280079596          4014887700      <- DIFFERENT!
-92532798           -4387500094     | (and all after this)
1426450655          5721417951      |
1270297459          -7319637133     |
724515670            9314450262     \/
985149401           -7604785191
474860476            9064795068
1835772983          -11049128905
1074387657           9664322249
-1053720936         -9643655528
1694389466           10284324058
986466010           -11898435878
515675343            13400577231
-1193933436          -14078835324
1642769264           14527671152
-613760253          -13498662141
-1846698612          15333170572
-1413082042          -14297983930
-855870241           16323998943
-762173577           -17942042761
2142423004           19322292188
1990603716          -19484232764
1579173090           18759042274
1709725566          -19765110914
1461885063           18641754247
-1926203195         -19106072379
417243165            17597112349
49636328        -17130232856
1538726269      18718595453
455874115       -16723995069
1247195722      18427064906
8361750             -17171507434
259214334       17439083518
-554290137      -17734159321
-3124955        17176744229
-96873497       -17276742681
1291888921      18471758105
1393850960      -20080985520
259706916       21734543396
-539020164      -22013856644
470244184       21945080664
1692667927      -24077135849
933098217       22407934697
-1138726268     -22613562748
-940775819      20534060661
900720715       -20574115765
-2142428835     19332407645
-1990784344     -19170653528
-1584772423     19890064057
-1883304743     -19063173927
1747095227      18926964411
-1674622765     -18854491949
-373698054      16806171130
1300262326      -15879606858
1653426493      14538328381
C/C++JS
---------------         -----------------
77                  77
2445                2445
75842               75842
2351179             2351179
72886654            72886654
-2035480916         -2035480916
1324601154          1324601154
-1887037154         -1887037154
1631390447          1631390447
-966503578          -966503578
103160276           103160276
-1096998635         -1096998635
352780784           352780784
-1948697477         -1948697477

-280079596 4014887700您在JS和PHP中得到了一个奇怪的结果,因为您使用的是IEEE浮点数,而不是整数。
>
运算符将其操作数视为有符号32位整数,但减法和加法则不然。这意味着在任何迭代中,当值介于
2^31
2^32-1
之间时,会得到不同的输出,因为JavaScript将其解释为无符号数而不是有符号数

您可以修复JavaScript并使其输出与C/C++相同的结果,方法是再次将结果视为带符号的32位整数:

const str=“M:/Mijn Muziek/各种艺术家/Revs&ElBee-告诉我的心。mp3”
const hashCode=getHashCode(str);
log(hashCode);
函数getHashCode(s)
{
var hash=0,c=(typeof s=='string')?s.length:0,i=0;
while(i0);}//添加了>>>0
返回值(哈希值<0)?((哈希值*-1)+0xFFFFFFFF):哈希;/*转换为无符号整数*/

}
您必须转换
的结果((散列0;//转换为32位整数
console.log(散列);
}
返回值(哈希值<0)?((哈希值*-1)+0xFFFFFFFF):哈希值;
}

getHashCode(“M:/Mijn Muziek/各种艺术家/Revs&ElBee-告诉我的心。mp3”)
谢谢你的回答,稍后再看,不过问题是要在C中实现与Javapascript相同的行为。我在PHP中也有相同的行为,两者都产生相同的结果,因此必须有一些技巧才能使其工作。@Codebeat我用C代码更新了我的答案,该代码的行为方式与JS和PHP相同。您好,全部都试过了,JavascScript版本可以工作,但C版本不能,仍然是相同的结果。当我需要更改javascript和php版本时,这是一个真正的问题,因为它在项目中到处使用。javascript版本中也有一个输入错误,>>>>必须>>@Codebeat
>>>
在第二个操作数为0时做的事情与
>>
相同。谢谢至于答案,请稍后再看,但是问题是如何在C而不是Javapascript中实现相同的行为。我在PHP中有相同的行为,两者都产生相同的行为,因此必须有一些技巧才能使其工作。
uint64_t getHashCode( const char* s )
{
 int16_t  iLen  = strlen( s );
 int16_t  i     = 0;
 int32_t  hash  = 0;

 while( i < iLen ) 
  { 
     // hash<<5 = multiply by 32
    hash = ((hash<<5)-hash)+(uint8_t)s[i++]; 
  }

 return (( hash < 0 )?((hash*-1)+0xFFFFFFFF):hash); //convert to unsigned 
}
"M:/Mijn Muziek/Various Artists/Revs & ElBee - Tell It To My Heart.mp3"
C/C++               JS
---------------         -----------------
77                  77
2445                2445
75842               75842
2351179             2351179
72886654            72886654
-2035480916         -2035480916
1324601154          1324601154
-1887037154         -1887037154
1631390447          1631390447
-966503578          -966503578
103160276           103160276
-1096998635         -1096998635
352780784           352780784
-1948697477         -1948697477
-280079596          4014887700      <- DIFFERENT!
-92532798           -4387500094     | (and all after this)
1426450655          5721417951      |
1270297459          -7319637133     |
724515670            9314450262     \/
985149401           -7604785191
474860476            9064795068
1835772983          -11049128905
1074387657           9664322249
-1053720936         -9643655528
1694389466           10284324058
986466010           -11898435878
515675343            13400577231
-1193933436          -14078835324
1642769264           14527671152
-613760253          -13498662141
-1846698612          15333170572
-1413082042          -14297983930
-855870241           16323998943
-762173577           -17942042761
2142423004           19322292188
1990603716          -19484232764
1579173090           18759042274
1709725566          -19765110914
1461885063           18641754247
-1926203195         -19106072379
417243165            17597112349
49636328        -17130232856
1538726269      18718595453
455874115       -16723995069
1247195722      18427064906
8361750             -17171507434
259214334       17439083518
-554290137      -17734159321
-3124955        17176744229
-96873497       -17276742681
1291888921      18471758105
1393850960      -20080985520
259706916       21734543396
-539020164      -22013856644
470244184       21945080664
1692667927      -24077135849
933098217       22407934697
-1138726268     -22613562748
-940775819      20534060661
900720715       -20574115765
-2142428835     19332407645
-1990784344     -19170653528
-1584772423     19890064057
-1883304743     -19063173927
1747095227      18926964411
-1674622765     -18854491949
-373698054      16806171130
1300262326      -15879606858
1653426493      14538328381