Hash算法

要求

  • 正向快速:给定原文和 Hash 算法,在有限时间和有限资源内能计算得到 Hash 值
  • 逆向困难:给定(若干)Hash 值,在有限时间内无法(基本不可能)逆推出原文
  • 输入敏感:原始输入信息发生任何改变,新产生的 Hash 值都应该发生很大变化
  • 碰撞避免:很难找到两段内容不同的明文,使得它们的 Hash 值一致(即发生碰撞)

常见算法

MD5 SHA-1 SHA-2 SHA-3 SM3
推出时间 1992 1995 2002 2008 2010
输出长度 128 bit 160 bit 256/512 bit 224/256/384/512 bit
哈希冲突 较多 较多 很少 很少
安全等级 低,已被成功攻击 低,已被成功攻击
应用 已被弃用,仍用于数据完整性检查 已被弃用 加密货币交易验证、数字签名等( SHA-256 是最安全的哈希算法之一,仍未出现成功的攻击案例,因此常用在各类安全应用与协议中) 可用于替代 SHA-2 中国密码管理局于 2010 年 12 月 17 日发布了 GM/T 0004-2012 《SM3 密码杂凑算法》,建立了国内商用密码体系中的公开 Hash 算法标准

Hash冲突解决方案

链式地址

注:当链表很长时,查询效率 O(n) 很差。此时可以将链表转换为“AVL 树”或“红黑树”,从而将查询操作的时间复杂度优化至 O(log⁡n) 。

开放寻址

线性探测

  • 容易导致聚集现象
  • 需要使用懒删除,None和TOMSTONE都代表空桶,但是探测到TOMSTONE时要继续探测

为了提高性能,可以记录首个TOMBSTONE的索引,并将搜索到的目标元素与该 TOMBSTONE 交换位置

平方探测

  • 优点:缓解聚集现象,使数据更加均匀
  • 缺点:由于平方的增长,存在无法访问的空桶

多次哈希

  • 优点:不易产生聚集现象
  • 缺点:多个哈希函数带来额外计算量