哈希是什么?
哈希(Hash)一般叫做散列,意思就是把一堆任意长度的字符串、数字或者二进制输入通过一定的算法(非常多的哈希算法)生成固定长度的一个数字(字符串)。因为算法原因,不同的输入就会得到不同的哈希值。
哈希表是什么?
哈希表(Hash Table)一般叫做散列表,就是通过把键值计算出Hash值后,通过Hash值映射到表里面的某个位置。那么同样的键值,下次访问或者修改都是同一个映射位置,不同的键值因为计算出Hash值不一样映射的位置也会不同。
什么是哈希冲突(哈希碰撞)?
因为哈希值是通过一定算法生成的,那么就有一定的可能出现不同的输入得到的Hash值是一样的,就算我们可以通过调整算法尽量减少这种情况,但是也不可完全避免。发生这种情况后,我们就会出现两个不同的键值被映射到同一个位置了,这就是哈希冲突。
怎么解决哈希冲突?
- 开放定址
1、线性探测
出现Hash冲突后,依次查询这个键值后面的地址,找到一个空的或者全部查完没找到。
2、二次探测
出现冲突后,对这个键值后面的地址或者前面的地址进行平方后查询。
- 再哈希
构建多个Hash算法函数,出现冲突就用其他Hash算法进行Hash,直到不冲突为止。
- 链表法
也叫开链,C++的map就是使用这种方法,就是对每个位置新增一个链表,添加元素到链表中,只要链表元素不多,效率都还行。
- 设置公共溢区法