hash是什么?
hash也称为散列,就是把任意长度的输入,通过散列算法,变成固定长度的输出,这个输出值就是散列值。
举例来说明一下什么是hash:
假设我们要把1~12存入到一个大小是5的hash表中,我们就是用index=number%5的公式去计算索引存入数据
hash是一个神奇的数据结构,可以以接近O(1)的时间复杂度去进行查询
但是很快我们就会发现一个问题,就是相同的余数的值储存在同一个索引下,这样就会造成一个问题,比如我查询8是否存储在结构中,我们能直接访问array[3]这个位置,里面存储8,会返回给我们的一个true,然后如果我们想要查询13是否存在该结构中,还是会去array[3]中查找,发现里面没存有数据13,返回false
如何解决hash冲突?
首先,先来说一下哈希冲突,哈希冲突(Hash Collision)是指在使用哈希表存储数据时,两个或多个不同的键(Key)被哈希函数映射到同一个位置的情况。这种情况会导致数据的存储和查找变得复杂,因此需要采取一些措施来解决哈希冲突。
解决hash冲突的方法:
1.拉链法:
链地址法是一种处理哈希冲突的方法,它是将所有散列到同一个地址的数据项存储在一个单链表中。这样,当查找某个数据项时,只需要在对应的链表中进行搜索即可。例如,HashMap 在解决存储对象存在 hash 冲突的问题时,采用的就是链地址法,将相同 hash 值的对象以链表的形式进行存储。
2.再hash法
在发生冲突的时候,再用另一个哈希函数算出哈希值,直到算出的哈