【问题标题】:What's wrong with this hash?这个哈希有什么问题?
【发布时间】:2014-11-05 02:24:03
【问题描述】:

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

【问题讨论】:

  • 尝试输入一些长句,看看会返回什么。

标签: hash hashtable


【解决方案1】:

按位或等单调函数不适合计算哈希。

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

0 | 0 = 0

0 | 1 = 1

1 | 0 = 1

1 | 1 = 1

1的个数从未死亡,所以OR运算是单调递增函数。

如果对许多数据重复执行 OR 操作,结果很有可能变为 '1'。

如果您将长字符序列应用到您的代码中,您可能会经常或几乎总是得到 127(二进制中的“1111111”)作为结果。

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

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

【讨论】:

  • 啊!那讲得通!谢谢。
猜你喜欢
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 2012-11-02
  • 2016-09-19
相关资源
最近更新 更多