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