Javascript 哈希短字符串的异常行为



我尝试在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)
    }

当您在两个字母的字符串(如hash("AB"(和hash("AX"(上调用hash时,你会得到完全相同的结果。是的,我知道哈希冲突,但这里似乎只要第一个字母相同,第二个字母就不会改变任何东西,所以它只是被忽略了吗?为什么会这样?

length 1i=1时,((seed.length-1)-i)为0,或者更确切地说:每次到达最后一个字符时。我建议删除-1,否则您只会忽略最后一个字符。

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) . 对于最后一个字符,计算结果为 ** 0 。 任何数字的0次方等于1。 因此,最后一个字符始终被评估为 1 。 将其更改为** (seed.length-i),它不应该有这个问题。

如果是 2 个字母字符串。 因为,您的总迭代是 2 种子.长度等于 2。

所以,在第二次迭代中(种子长度-1(-i = 2 - 1 -1 = 0。因此,您得到的基本上是第一个Genseed,它等于第一次迭代的66。

最新更新