介绍布隆过滤器和哈希冲突

401 阅读3分钟

1.什么是 BloomFilter

布隆过滤器(Bloom Filter)是一种空间效率非常高的随机数据结构,用于判断一个元素是否在一个集合中。与传统的哈希表或者二叉搜索树等数据结构不同,布隆过滤器可以在空间和时间上做出很多妥协,从而实现高效的查询和插入操作。

布隆过滤器的核心思想是使用多个哈希函数来将元素映射到位数组中的多个位置上。当一个元素被加入到布隆过滤器中时,它会被多次哈希,并将对应的位数组位置设置为1。当需要判断一个元素是否在布隆过滤器中时,我们只需将该元素进行多次哈希,并检查对应的位数组位置是否都为1,如果其中有任意一位为0,则说明该元素不在集合中;如果所有位都为1,则说明该元素可能在集合中(因为有可能存在哈希冲突),需要进一步检查。

2.布隆过滤器的优缺点

布隆过滤器是一种概率型数据结构,用于快速判断一个元素是否存在于一个集合中。它具有以下优点和缺点:

image.png

3.布隆过滤器使用场景

常见的使用场景包括:

1.网页黑名单过滤:将恶意网站的 URL 存储到布隆过滤器中,当用户访问时,可以快速判断该网站是否为恶意网站,从而进行拦截或提示。

2.垃圾邮件过滤:将已知的垃圾邮件的特征(如发件人、主题、内容等)存储到布隆过滤器中,当新邮件到来时,可以快速判断是否为垃圾邮件,从而进行过滤。

3.⭐缓存穿透问题解决:当缓存中不存在某个键值对时,可以先通过布隆过滤器判断该键是否存在,如果不存在,则直接返回空值,避免了对数据库等后端存储的不必要查询,从而提高了系统的性能。

4.什么是哈希冲突

哈希表:是一种实现关联数组抽象数据类型的数据结构,这种结构可以将关键码映射到给定值。简单来说哈希表(key-value)之间存在一个映射关系,是键值对的关系,一个键对应一个值。

哈希冲突:当两个不同的数经过哈希函数计算后得到了同一个结果,即他们会被映射到哈希表的同一个位置时,即称为发生了哈希冲突。简单来说就是哈希函数算出来的地址被别的元素占用了。

5.怎么解决哈希冲突

开放定址法: 我们在遇到哈希冲突时,去寻找一个新的空闲的哈希地址 举例:就是当我们去教室上课,发现该位置已经存在人了,所以我们应该寻找新的位子坐下,这就是开放定址法的思路。如何寻找新的位置就通过以下几种方法实现。

1.线性探测法

我们的所需要存放值的位置被占了,我们就往后面一直加1并对m取模直到存在一个空余的地址供我们存放值,取模是为了保证找到的位置在0~m-1的有效空间之中。

公式:h(x)=(Hash(x)+i)mod (Hashtable.length);(i会逐渐递增加1)

image.png

2.平方探测法

当我们的所需要存放值的位置被占了,会前后寻找而不是单独方向的寻找。

公式:h(x)=(Hash(x) +i)mod (Hashtable.length);(i依次为+(i^2)和-(i^2))

image.png