Javascript用短字符串散列不寻常的行为

时间:2017-05-24 20:24:58

标签: javascript hash

我尝试在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;)等双字母字符串上调用哈希时,您会得到完全相同的结果。是的我知道哈希冲突,但似乎只要第一个字母是相同的,第二个字母什么都没有改变,那么它只是被忽略了吗?为什么会发生这种情况呢?

3 个答案:

答案 0 :(得分:1)

((seed.length-1)-i)length1时,

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");,否则你只是忽略了最后一个字符。

&#13;
&#13;
** ((seed.length-1)-i)
&#13;
&#13;
&#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。