尝试用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;
}
答案 0 :(得分:2)
请记住哈希表(使用任何语言......)实际上是如何工作的:它包含(通常是素数)“桶”的数量。 hash-function的目的只是将任何传入的键值转换为bucket-number。 (最糟糕的情况是100%的传入密钥在一个桶中结束,留下“链表”。)你只需要设计一个“通常”会产生“哈希”的哈希函数。广泛分散的“价值分布,这样,当计算模数(素数......)桶数时,”大部分时间,大多数桶“将”或多或少地平等“ 填充。 (但请记住:你永远无法确定。)
完全可以预料到“碰撞”:实际上,“它们一直在发生。”在我的拙见中,你“过度思考”哈希函数:我认为根本没有使用Math.pow()
的令人信服的理由。期望您生成的任何值都将通过其绝对值 modulo 的桶数转换为哈希桶号。查看您是否想出一个好的(对于您的数据......)的最佳方法是观察桶大小的最终分布。 (对于你的目的来说,它还“足够好”吗?)