我尝试在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
1
和i=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。