首页 > 其他分享 >布隆过滤器和寻找嫌疑人

布隆过滤器和寻找嫌疑人

时间:2024-01-27 20:57:00浏览次数:23  
标签:嫌疑人 特征 元素 布隆 URL 过滤器

20240127193436

布隆过滤器,听过也学过,实际中没怎么用到,时间长了再接触这个概念就陌生了,说到底还是没有彻底掌握。为了真正理解一项技术或一个概念,最好还是从问题出发,所以布隆过滤器到底解决了什么问题呢?

布隆过滤器可以用来检测一个元素是否属于某个集合。

上面的定义比较抽象,下面有些具体的例子(参考这篇文章的内容:https://zhuanlan.zhihu.com/p/94433082):

  • 网页爬虫对 URL 去重,避免爬取相同的 URL 地址
  • 反垃圾邮件,从数十亿个垃圾邮件列表中判断某邮箱是否垃圾邮箱
  • Google Chrome 使用布隆过滤器识别恶意 URL
  • Medium 使用布隆过滤器避免推荐给用户已经读过的文章
  • Google BigTable,Apache HBbase 和 Apache Cassandra 使用布隆过滤器减少对不存在的行和列的查找
  • 解决恶意查询请求所带来的缓存穿透

从以上例子看,布隆过滤器确实很厉害,用处很多。不过如果我还没有这些项目的开发经验,怎么能用更通俗的方式理解布隆过滤器能解决什么问题呢? 最近悬疑剧看的多,我想到了破案这个场景。

警察是怎么寻找嫌疑人的?

警察破案,在寻找嫌疑人的时候,一般都会根据以下几种特征去筛查:

  • 身份特征:包括姓名、性别、年龄、国籍、职业、住址等。
  • 外貌特征:包括身高、体重、体型、肤色、发型、眼睛颜色、脸型、胡须、纹身、疤痕等。
  • 行为特征:包括动机、手法、习惯、特点、爱好、嗜好、交际圈等。
  • 物品特征:包括作案工具、作案车辆、作案服装、作案物品、遗留物品等。

通常犯罪分子在犯罪之后都会潜逃到其他地方,警察需要一个个地方,甚至一个个城市去筛查,这个时候怎么样快速破案就成了一个关键问题。如果拿着嫌疑人的照片一个个去比对,显然太慢了,那么快速的方式是什么呢?假设我们有个“法外狂徒”张三,具备以下的特征:

特征 例子 0或1
性别 1
性别 0
年龄 35 1
身高 175厘米 1
体重 70公斤 1
体型 偏瘦 1
肤色 黄色 1
发型 短发 1
眼睛颜色 黑色 1
脸型 方形 1
纹身 1
疤痕 左眼角有一道 1
习惯 喜欢喝咖啡 1
特点 话少 1
嗜好 喝酒 1

警察到了一个新的地方,会快速收集以上信息(通过公安系统或走访群众),判断一个区域内有没有人同时具备以上特征,如果没有,那犯罪嫌疑人肯定不在这个区域了,就可以继续排查下一个地方。如果发现该地区有人符合上述全部特征呢?那也并不代表一定就找到了嫌疑人,但是可以大大缩小排查的范围。

布隆过滤器

警察寻找嫌疑人的过程,不就是布隆过滤器的工作原理吗?

首先,警察寻找嫌疑人和上面列举的互联网产品中需要解决的问题都是一类问题:

例子 元素 集合
警察寻找嫌疑人 嫌疑人 一个地区内的所有人
网页爬虫URL去重 一个URL 是否在已经爬取的URL列表内
反垃圾邮件 一个邮箱地址 垃圾邮箱地址库
避免推荐给用户已经读过的文章 一篇文章 已经推荐给用户的文章集合
意查询请求带来的缓存穿透 请求所查询的商品 是否是商品库中真实存在的商品

警察会给嫌疑人列举一系列的特征,然后去看一个地区内是否有人具备所有这些特征。而布隆过滤器的原理是用哈希函数生成一个很长的0/1串,实际上我们可以把值为1的位置看作该元素具有这个位置的特征。接下来我们要去跟待筛选的集合进行比对,这个过程我们不需要一一比对,只需要去查看集合内是否有元素具备这个特征。这里我们需要维护两个向量:

内容 特征向量 例子
元素 长度为N的向量,每个位置是0或1:1代表该元素具有该特征 嫌疑人一系列特征,1代表具有
集合 长度为N的向量,每个位置是0或1:1代表集合中存在一个元素具备这个特征 一个地区内人口的综合统计信息

接下来要做的就是比对这两个向量即可,而不是将元素和集合中的每个元素一一对比。

布隆过滤器的优点是查询速度快,缺点是不保证百分百准确。就好比说:即使我们在一个地方找到了符合所有犯罪嫌疑人特征的人,也有可能找错。

总结

通过寻找犯罪嫌疑人的例子来理解布隆过滤器,可能更容易记住吧。

如果你喜欢我的文章,欢迎到我的个人网站关注我,非常感谢!

标签:嫌疑人,特征,元素,布隆,URL,过滤器
From: https://www.cnblogs.com/hackerphysics/p/17991921

相关文章

  • Vue2入门之超详细教程十六-过滤器
    Vue2入门之超详细教程十六-过滤器1、简介过滤器定义:对要显示的数据进行特点格式化后再显示(适用于一些简单逻辑的处理)语法:1.注册过滤器:Vue.filter(name,callback)或newVue(filters:{})2.使用过滤器:{{xxx|郭琪琪名}}或v-bind:属性="xxx|过滤器名称"备注:1.过......
  • Java web的过滤器Filter
    注:来自《JavaWeb入门经典》一书,仅供参考和学习。1.过滤器的核心对象2.创建并配置过滤器......
  • 后端登陆的过滤器
    后端登陆的过滤器packagecom.itheima.filter;importcom.google.gson.Gson;importcom.google.gson.JsonObject;importcom.itheima.pojo.Result;importcom.itheima.utils.JwtUtils;importlombok.extern.slf4j.Slf4j;importorg.springframework.boot.configurationpro......
  • 使用过滤器记录api接口访问时长并记录日志
    usingERP.Helper;usingERP.Models.User;usingSystem;usingSystem.Diagnostics;usingSystem.Web;usingSystem.Web.Http.Controllers;usingSystem.Web.Http.Filters;usingActionFilterAttribute=System.Web.Http.Filters.ActionFilterAttribute;usingLogger......
  • Druid作为数据源(连接池、过滤器、日志)
    Druid作为数据源(连接池、过滤器、日志)druid基本参数介绍name:数据源名称如果存在多个数据源,监控的时候可以通过名字来区分开来如果没有配置,将会生成一个名字,格式是"DataSource-"+System.identityHashCode(this)jdbcUrl:连接数据库的url,不同数据库不一样username:连接......
  • 布隆过滤器详解——转载自IT老暖男
    前言我们之前讲了Redis的缓存雪崩、穿透、击穿。在文章里我们说了解决缓存穿透的办法之一,就是布隆过滤器,但是上次并没有讲如何使用布隆过滤器。作为暖男的老哥,给你们补上,请叫我IT老暖男。什么是布隆过滤器布隆过滤器(BloomFilter),是1970年,由一个叫布隆的小伙子提出的,距今已......
  • CAN通信配置过滤器和使用三个邮箱发送
    RM比赛用的电机基本都使用CAN通信,但是一条CAN线上只用一个发送邮箱在挂在设备多的情况可能会导致发送不完,但其实完全可以把三个发送邮箱都用上。这里贴一下自己的CAN筛选器,接收以及发送的代码。完整的工程可以看我开源的飞机云台程序~项目代码开源地址:https://github.com/ittuann......
  • Gateway网关模块中设置全局过滤器
    以下是一个用来做登录校验的全局过滤器@Component@Slf4jpublicclassAuthorizeFilterimplementsOrdered,GlobalFilter{@OverridepublicMono<Void>filter(ServerWebExchangeexchange,GatewayFilterChainchain){//1.获取request和response对象......
  • 【Java】过滤器和拦截器的位置
    过滤器(Fliter)和拦截器(Intercetor)区别 过滤器(Fliter)拦截器(Interceptor)总结定义位置Fliter定义在java.servlet包下 接口HandlerInterceptor定义在org.springframework.web.servlet包下 配置位置配置在web.xml中 配置在springmvc.xml中 作用位置Fliter在......
  • 安全检验---过滤器与拦截器
    过滤器简介什么是过滤器(Filter)Filter表示过滤器,是JavaWeb三大组件(Servlet,Filter,Listener)之一过滤器可以把对资源的请求拦截下来,从而实现设置好的特殊功能使用了过滤器之后,想要访问Web服务器上的资源,需要先经过过滤器,过滤器处理完毕之后,才可以访问对应的资源。过滤器一......