2014-11-05 60 views
0

这个散列函数有什么问题?具体来说,当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

尝试输入一些长句子,看看会返回什么。 – ymonad 2014-11-05 02:39:43

回答

0

单调函数如按位或不适合计算散列。

如您所知,OR运算符“|”工作如下。

0 | 0 = 0

0 | 1 = 1

1 | 0 = 1

1 | 1 = 1

1的数量从未降低,所以OR操作是单调的增量函数。

如果对多个数据反复应用OR操作,结果可能变为'1'。

如果将长字符序列应用到代码中,则可能会有127(二进制中的“1111111”)作为频繁或几乎时间的结果。

按位AND也不合适,因为AND是单调递减函数。

XOR是计算哈希的最合适的按位运算。

+0

啊!这就说得通了!谢谢。 – Chris 2014-11-05 03:09:21