数据结构

哈希

散列表

散列表(Hash table,也叫哈希表)是根据键(key)而直接访问在内存存储位置的数据结构。即,通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,该函数叫散列函数,存放记录的数组叫做散列表

散列函数

特点

  1. 确定性
    如果两个散列值不同(by同一函数),则其原始输入也不同。
  2. 散列碰撞(collision)
    输入输出不唯一对应,不同输入可能对应相同输出。
  3. 不可逆性
    一个哈希值对应无数明文,理论上不可逆。
  4. 混淆特性
    部分改变输入值,一个具有强烈混淆特性的散列函数会产生一个完全不相同的散列值

常见散列函数

  • MD5
  • SHA-1

散列冲突

即使再好的散列函数也无法避免冲突,当待存储数据大于存储区域(n)时,必然会存在哈希值相同的情况,即散列冲突。
解决方法

  1. 开放寻址法
  • 线性探测方法
    冲突时依次往后查找,看是否有空闲位置,直到找到为止。
  • 二次探测
    冲突时依次找hash + 1^2, -1^2, +2^2, -2^2, +3^2...
  • 双重散列
    通过多个散列函数依次查找
  1. 链表法
    在散列表中,每个位置对应一条链表,所有散列值相同的元素都放在相同位置对应链表中。
    image

你可能感兴趣的:(数据结构)