标签搜索

哈希冲突TODO

anker
2021-06-26 / 0 评论 / 11 阅读 / 正在检测是否收录...

设计哈希表时,选择不同的哈希函数有不同性能表现。重点在于哪种散列函数可以有效避免冲突。
如果出现了冲突,一般都有哪些冲突解决办法。

  1. 线性探测
  2. 二次探测
  3. 开链法(GCC使用的SGI版本STL就是基于此方法)
    虽然开链法并不要求表格大小必须为质数,但SGI STL 仍然以质数来设计表格大小,并且将28个质数(逐渐呈现大约两倍的关系)计算好,以备随时访问,同时提供一个函数,用来查询在这28个质数之中,“最接近某数并大于某数”的质数。在JDK8以前也是使用链表来处理冲突。JDK8以后在链表超过8时使用平衡树来存储。建议使用头插法而不是尾插法入链。因为最近增加的元素有很大概率被下次访问。

常见的哈希算法:MD5SUM、SHA1、DJBX33A(Java HashCode)、CRC32(部分硬件原语加速)、CRC16、MurMurHash(速度比MD5快)、SipHash(Redis\Python使用)

哈希算法从安全性又可以分两类

  • 加密哈希函数如SHA
  • 非加密哈希函数。

服务器中使用哈希算法需要考虑:

  • 哈希攻击(hash flooding attack)。不要对不明数据进行哈希。而MurMurHash和SipHash使用了种子的概念实现随机化哈希,增加了攻击的难度。因此SipHash也被称为带密钥哈希算法(Keyed Hash Function),天生免疫哈希攻击。
  • 加盐哈希方案。通过增加一些随机的盐参数,把需要加密的账号密码更安全的存储。
0

评论 (0)

取消