java哈希函数碰撞

时间:2016-07-25 01:30:41

标签: java hash hashmap

尝试用Java编写自己的哈希函数。我知道这与java实现的相同,但我想自己测试一下。当我输入不同的值并且不确定原因时,我会发生碰撞。

public static int hashCodeForString(String s) {   
int m = 1;
int myhash = 0;
    for (int i = 0; i < s.length(); i++, m++){
    myhash += s.charAt(i) * Math.pow(31,(s.length() - m));
    }
return myhash;
} 

1 个答案:

答案 0 :(得分:2)

请记住哈希表(使用任何语言......)实际上是如何工作的:它包含(通常是素数)“桶”的数量。 hash-function的目的只是将任何传入的键值转换为bucket-number。 (最糟糕的情况是100%的传入密钥在一个桶中结束,留下“链表”。)你只需要设计一个“通常”会产生“哈希”的哈希函数。广泛分散的“价值分布,这样,当计算模数(素数......)桶数时,”大部分时间,大多数桶“将”或多或少地平等“ 填充。 (但请记住:你永远无法确定。)

完全可以预料到“碰撞”:实际上,“它们一直在发生。”

在我的拙见中,你“过度思考”哈希函数:我认为根本没有使用Math.pow()的令人信服的理由。期望您生成的任何值都将通过其绝对值 modulo 的桶数转换为哈希桶号。查看您是否想出一个好的(对于您的数据......)的最佳方法是观察桶大小的最终分布。 (对于你的目的来说,它还“足够好”吗?)