这个哈希函数有什么问题?具体来说,当传入N = 127时会发生什么?
int hash3(char *k, int N)
{
char *c; int h = 0;
for (c = k; *c != '\0'; c++) {
h = h | *c;
}
return (h % N);
}
这是一个在练习考试中提出的问题(遗憾的是没有解决方案)。据我所知,该函数使用按位或将字符串转换为整数,并将其放在一个大小为N的表中,但我真的不知道它为什么会出错?提前谢谢。
答案 0 :(得分:0)
按位OR等单调函数不适合计算散列。
如您所知,OR运算符“|”工作如下。
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
1的数量从未死亡,因此OR运算是单调的增量函数。
如果对多个数据重复应用OR运算,结果可能会变为“1”。
如果将长字符序列应用于代码,则可能经常或几乎是时间结果为127(二进制为“1111111”)。
按位AND也不合适,因为AND是单调的递减函数。
XOR是计算Hash的最合适的按位运算。