检查一个元素是否在某一个集合中,使用HashSet是比较好的选择,因为在不发生Hash碰撞的情况下它的时间复杂度为常数级别,但是在数据量比较大的情况下,使用HashSet将会占用大量的内存空间。举个例子,长城防火墙有100亿个需要屏蔽的网址,来自计算机的每一次请求都要经过防火墙的过滤判断请求URL是否在黑名单中,如果我们使用HashSet来实现过滤的话,我们假设每个URL的大小为64B,那么100亿个就至少需要大约640GB的内存空间,这显然是不符合实际情况的。
布隆过滤器解决大数据检查问题
并非百分百保正确
假如输入的元素不在集合中,由于元素过多而bit数组过小,导致数组中的大部分bit为均为1,有可能误判该元素就在集合中。可能误判
假如输入对象就在集合中,那么数组中的bit为肯定为1。一定不会误判
对于已经发现的元素,放入HashSet中。经过布隆过滤器前先过滤下。
数据结构
bit数组。每个bit只有0和1两种状态。
原理
元素通过hash函数得到n个key值,与数组大小取余算出在桶中的位置。将bit置为1。
将集合中所有的元素按此步骤走一遍即得到布隆过滤器。