【问题标题】:Too many hashing function collisions哈希函数冲突过多
【发布时间】:2019-03-25 07:53:15
【问题描述】:

我正在尝试使用多项式累积方法(应该每 55k 字或其他东西给你 5 次冲突)创建一个散列函数,但是当我用 1,000 个字运行它时,我得到了大约 190 次冲突。我做错了吗?

public int hashCode(String str) {
        double hash_value = 0; // used for float
        for (int i = 0; i < str.length(); i++){
            hash_value = 33*hash_value + str.charAt(i);
        }
        return (int) (hash_value % array_size);
    }

【问题讨论】:

  • 除了使用 double 和 33 之外,这与内置的字符串散列方法基本相同。为什么你不能使用它?

标签: java hash hashtable hashcode


【解决方案1】:

要么您的数据集非常“不走运”,要么(更有可能)array_size 太小(通常引用哈希函数参数而不考虑有限桶数组大小)。

【讨论】:

    【解决方案2】:

    通常,质数更适合生成哈希码。我建议尝试 109 或 251。33 是 3 的倍数,这意味着根据您的输入,您更有可能遇到问题。

    您还应该使用 int 进行计算并在结果上调用 Math.abs。

    【讨论】:

    • "并在结果上调用 Math.abs" 为什么? hashCode 不必返回非负数。
    • @AndyTurner 是的,但是从% array_size 我假设这将用作数组的索引。
    【解决方案3】:

    您正在为输入中的不同单词生成大量不同的数字。但是还是有可能发生碰撞的,比如

    "bA" = 98+(33x65)=2243
    "AB" = 65+(33x66)=2243
    

    如果你选择大于 57 的大数字,那么碰撞的机会就会减少。 109 或 251 会是不错的选择。

    【讨论】:

      猜你喜欢
      • 2014-10-02
      • 1970-01-01
      • 2019-03-17
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多