布隆过滤器的做用就是判断元素,在某个元素集中是否存在。算法
hashmap的问题数组
实际上hashmap也能达到一样的效果,但与布隆过滤器的区别以下:对象
hashmap的大体原理就是,把全部装入的键值对都存到一个Entry对象里,而后根据key值hash出一个常数,做为该键值对的索引值,并把键值对存入与索引值相同下标的数组,下次寻找该键值对时,直接hash传入key值,而后查找数组下标与hash结果相同的项,里面就是要找的键值对。索引
若是两个键值对被hash到了同一个数组下标,则查询到该下标时进行遍历key值比较。hash
优势:查询快,且可以保存完整的键值对。hashmap
缺点:若是只是想单纯判断数值是否存在,这种判断代价有点太昂贵了,由于毕竟hashmap里保存了全部键值对的本体。原理
布隆过滤器遍历
使用场景:map
当数据集过大,且仅仅只是须要判断指定数据是否存在于数据集中时(布隆过滤器不具有任何储存功能,仅仅如其名称同样,只具有过滤判断元素是否存在的功能)。数据
算法步骤:
一、准备多个hash算法,每一个hash算法都能将元素hash成一个常数(常数<n)。
二、准备一个长度为n的数组,且初始里面各项都为0
三、每“装进来”一个元素,就用准备好的多个hash算法,把元素hash成多个常数,并把数组中下标为这些常数的项设为0.
四、若是要判断一个元素“是否被装进来”过,就用准备好的hash算法对其进行hash为多个常数,并判断数组里这些常数下标中的项是否为1.
若是都为1,则表示该元素“可能”被装进来过。
若是哪怕有一项为0,则该元素必定没有被装进来过。
问题:
一、只能作到高几率保证元素存在。
由算法流程可见,即便元素hash后全部常数,在数组的对应下标里值都为1,也只是有几率该元素装载过,由于可能元素hash后的全部常数下标,恰好和其余元素的hash值相同。
二、没法从总装载元素中剔除元素。
若是咱们想从已经装过的元素集中“删掉一个”,实际上也是不可能的,由于元素都被hash成多个数组下标了,你根本不能肯定你删的那个数组下标只是被删元素的hash值,仍是别的元素的hash值。