为什么哈希函数不使用随机性?

时间:2017-04-21 21:21:01

标签: java algorithm performance

我在CLRS中读到了好的哈希函数:<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <input type="text" id="numbers" /> <button id="getinfo">Get Info</button> 其中h(x) = ((a*x + b)mod p) mod m随机,a,b素数,p表格大小

我在任何编程语言的库中都找不到这个哈希函数,特别是在Java中。为什么? 我正在谈论hashCode的实现。

4 个答案:

答案 0 :(得分:2)

好的,两个答案都错过了标记。 jwodder谈到用随机盐腌制哈希,胡安完全谈论其他事情。

你谈到的哈希函数确实有随机a和b,但它只获得随机a,b一次。然后在数据的生命周期中使用相同的值。否则,你可能会得到一个场景,其中相同的值具有不同的哈希值,并且没有盐来区分它们为什么不同。

根据散列表的需要,您列出的散列适用于随机将值分配到存储桶中。但是,您在java中看到的哈希函数将是加密的,用于完整性和身份验证。或者,如果您实际上正在研究用于哈希表的代码,您可能会看到随机值a和b,但它们只是那时的常量,它们是在被添加到库之前随机生成的。

答案 1 :(得分:0)

(假设你的意思是&#34;哈希&#34;如&#34;哈希表/哈希映射&#34;而不是像SHA1这样的加密哈希)

哈希设计中的现代最佳实践 实际上涉及随机性,以防止因输入所有哈希值相同的人所引起的拒绝服务攻击。 Python, for example, does this since version 3.3,我相信Perl的最新版本也可以;另见:http://www.ocert.org/advisories/ocert-2011-003.html

答案 2 :(得分:0)

在某些情况下,这可能是一个很好的哈希函数,但它可能是一个糟糕的hashCode实现。 Java hashCode应该返回任意int,因此通过mod pmod m限制它是没有意义的。

在像java.util.HashMap这样的哈希表中,表大小始终是2的幂,这允许使用按位AND而不是慢模数计算。实际上,由于速度的原因,两张桌子的非功率几乎没有使用过。

在公式中使用任意随机ab肯定是错误的。使用a==0是一次全面灾难,a==pa==m也是如此。使用a==0x80000000只会稍好一些,而a还有许多其他非常糟糕的值。

请注意,使用b`只是浪费时间,特别是它不会增加散列dos保护。虽然它使哈希值不可预测,但它保留了所有冲突。

答案 3 :(得分:-1)

哈希不需要是随机的,其目标是在基于随机输入的有限范围的可能结果中提供均匀分布。