这个哈希有什么问题?

时间:2014-11-05 02:24:03

标签: hash hashtable

这个哈希函数有什么问题?具体来说,当传入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的表中,但我真的不知道它为什么会出错?提前谢谢。

1 个答案:

答案 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的最合适的按位运算。