佚名通过本文主要向大家介绍了哈希函数,哈希函数算法,哈希函数值,哈希函数的特点,什么是哈希函数等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:哈希函数取余法除数为何要取质数?
解决方案1:
解决方案1:
http://www.zhihu.com/question/20806796/answer/21359160
解决方案2:我上一个问题中弄错的一个地方是讨论了哈希结果暴露原值,而不是避免冲撞这个角度。
恰好等于或接近2^i的风险我认为都只是暴露原值。能轻易操纵哈希目标值的特征,在安全性上是一个巨大的风险——这样就留下了用户使用特意构造的输入,去试图占用其他哈希值桶的攻击方法。
而质数才是用来避免冲撞。如果种子用合数,那么很可能对合数的某个因数取余,所得到的余数仍然是一样的。这样就增加了同一个桶中元素的共同特征,危害了平摊的效果。
举个例子:对4取余如果余1,那么对2取余仍然余1,那么1号桶就必然全部是奇数。同理0号桶必然是偶数。
从这一点来看,质数与接近2^i与否其实完全是两个无关的问题。
我必须说明的是:引文第3段的说法是一个极其想当然的糟糕解释。
理由很简单:Java开发小组会蠢到用简单取余算法去做HashSet么?原文作者分明就是把别人的完整实现蓄意偷来一部分,用来给自己偏执的观点贴金。
最后仍然必须再次声明的是:单纯取余的哈希运算很糟糕。“远离2^i的质数”、“接近2^i的质数”、“恰好等于2^i”都只不过是“没有那么差”、“确实很差”和“差到不能再差”的区别。
要么为冲撞做好准备,给每一个桶都构造一个链表,要么就任何时候都使用SHA-1等成熟且冲撞概率稳定而足够低的Hash算法。