我尝试在Javascript中创建一个哈希函数,我注意到它的一个版本有两个字母字符串的奇怪行为。
function hash(seed) {
var genseed = 0;
for(i=0;i<seed.length;++i) {
genseed += seed.charCodeAt(i)**((seed.length-1)-i);
}
console.log(genseed)
}
当您在哈希(&#34; AB&#34;)和哈希(&#34; AX&#34;)等双字母字符串上调用哈希时,您会得到完全相同的结果。是的我知道哈希冲突,但似乎只要第一个字母是相同的,第二个字母什么都没有改变,那么它只是被忽略了吗?为什么会发生这种情况呢?
答案 0 :(得分:1)
((seed.length-1)-i)
为length
和1
时, i=1
为0,或者更确切地说:每次到达最后一个字符时。{p> -1
为0。我建议删除function hash(seed) {
var genseed = 0;
for (i = 0; i < seed.length; ++i) {
genseed += seed.charCodeAt(i) ** ((seed.length) - i);
}
console.log(genseed)
}
hash("AB");
hash("AX");
,否则你只是忽略了最后一个字符。
** ((seed.length-1)-i)
&#13;
答案 1 :(得分:0)
问题出在这一部分:** 0
。对于最后一个字符,评估结果为0
。任何1
幂等于1
的数字。因此,最后一个字符始终被评估为** (seed.length-i)
。将其更改为data['query']['pages']
,它不应该有这个问题。
答案 2 :(得分:0)
如果是2个字母的字符串。因为,你的总迭代次数是2 seed.length变得等于2.
所以,在第二次迭代中 (seed.length-1)-i = 2 - 1 -1 = 0.因此,你得到的基本上是第一次种子,从第一次迭代开始等于66。