Hash中文翻译为 “散列”,以下统称其音译 “哈希

哈希映射

哈希映射(Hash Map)是根据 键值对 (Key value)直接进行访问的数据结构。通过把键值映射到表中一个位置来访问记录,以加快查找的速度,这个映射函数叫做哈希函数,存放记录的数组叫做哈希表。也就是说,使用哈希函数将键映射到存储桶(哈希表)中。

在C++STL中的实现为:unordered_map 键值对的集合,按照键生成散列,键是唯一的。

特点:

  • 如果两个哈希值是不相同的(根据同一函数),那么这两个散列值的原始输入一定是不相同的。
  • 如果两个哈希值相同,两个输入值很可能(极大概率)是相同的,但也可能不同,这种情况称为“哈希冲突”或“哈希碰撞”
  • 抗篡改能力:对于一个数据块,哪怕只改动其一个比特位,其hash值的改动也会非常大
  • 哈希映射是“非对称”的,是一个从明文到密文的不可逆的映射, 只能加密, 没有解密

哈希集

哈希集合是集合数据结构的实现之一,用于存储非重复值。C++STL中的实现为 unordered_set 唯一键的集合,按照键生成散列

哈希冲突

当两对数据的哈希值相同时,就发生了哈希冲突,也叫作哈希碰撞。

在实际应用中,无论如何构造哈希函数,冲突是无法完全避免的。处理哈希冲突的两种主要的方法:开放寻址法和拉链法。

  • 开放寻址法:当发生地址冲突时,按照某种方法继续探测哈希表中的其他存储单元,直到找到空位置为止。比如线性探查(存放到下一个空间中)、二次探查、伪随机探测、再哈希法等 参考:解决哈希冲突的三种方法

  • 拉链法:将发生冲突的元素都插入到头指针为 ST[ i ] 的链表中。这种方法有点近似于邻接表的基本思想,且这种方法适合于冲突比较严重的情况。

哈希查找

哈希查找是通过哈希映射直接计算数据元素的存储地址进行查找的一种方法。步骤如下:

  1. 用给定的哈希函数构造哈希表;
  2. 根据选择的冲突处理方法解决地址冲突;
  3. 在哈希表的基础上执行哈希查找。

对于无冲突的Hash表而言,查找复杂度为O(1),是速度最快的查找方法。