url过滤怎么解除_腾讯面试官是这样来问布隆过滤器的?

作者:张振伟来源:https://zhangzw.com/20190521.html

假设遇到这样一个问题:一个网站有 20 亿 url 存在一个黑名单中,这个黑名单要怎么存?若此时随便输入一个 url,你如何快速判断该 url 是否在这个黑名单中?并且需在给定内存空间(比如:500M)内快速判断出。

可能很多人首先想到的会是使用 HashSet,因为 HashSet基于 HashMap,理论上时间复杂度为:O(1)。达到了快速的目的,但是空间复杂度呢?URL字符串通过Hash得到一个Integer的值,Integer占4个字节,那20亿个URL理论上需要:20亿*4/1024/1024/1024=7.45G的内存,不满足空间复杂度的要求。

这里就引出本文要介绍的“布隆过滤器”。

d0392c2827fafbb332bed1da05e0d244.png

# 何为布隆过滤器

百科上对布隆过滤器的介绍是这样的:

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

是不是描述的比较抽象?那就直接了解其原理吧!

还是以上面的例子为例:

哈希算法得出的Integer的哈希值最大为:Integer.MAX_VALUE=2147483647,意思就是任何一个URL的哈希都会在0~2147483647之间。

那么可以定义一个2147483647长度的byte数组,用来存储集合所有可能的值。为了存储这个byte数组,系统只需要:2147483647/8/1024/1024=256M。

比如:某个URL(X)的哈希是2,那么落到这个byte数组在第二位上就是1,这个byte数组将是:000….00000010,重复的,将这20亿个数全部哈希并落到byte数组中。

判断逻辑

如果byte数组上的第二位是1,那么这个URL(X)可能存在。为什么是可能?因为有可能其它URL因哈希碰撞哈希出来的也是2,这就是误判。

但是如果这个byte数组上的第二位是0,那么这个URL(X)就一定不存在集合中。

多次哈希

为了减少因哈希碰撞导致的误判概率,可以对这个URL(X)用不同的哈希算法进行N次哈希,得出N个哈希值,落到这个byte数组上,如果这N个位置没有都为1,那么这个URL(X)就一定不存在集合中。

# Guava的BloomFilter

Guava框架提供了布隆过滤器的具体实现:BloomFilter,使得开发不用再自己写一套算法的实现。

# 创建BloomFilter

BloomFilter提供了几个重载的静态 create方法来创建实例:

348f7495a2ce7224241b342482199be0.png

最终还是调用:

37cece66627e5ccd363f3409541dbfdd.png

BloomFilter里byte数组的空间大小由 expectedInsertions, fpp参数决定,见方法:

fb23c7d5c4e5af3062428d077367b676.png

真正的byte数组维护在类:BitArray中。

# 使用:

最后通过:put和 mightContain方法,添加元素和判断元素是否存在。

# 算法特点

1、因使用哈希判断,时间效率很高。空间效率也是其一大优势。

2、有误判的可能,需针对具体场景使用。

3、因为无法分辨哈希碰撞,所以不是很好做删除操作。

# 使用场景

1、黑名单

2、URL去重

3、单词拼写检查

4、Key-Value缓存系统的Key校验

5、ID校验,比如订单系统查询某个订单ID是否存在,如果不存在就直接返回。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505262.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python dataframe遍历_对Python中DataFrame按照行遍历的方法

对Python中DataFrame按照行遍历的方法在做分类模型时候,需要在DataFrame中按照行获取数据以便于进行训练和测试。import pandas as pddict[[1,2,3,4,5,6],[2,3,4,5,6,7],[3,4,5,6,7,8],[4,5,6,7,8,9],[5,6,7,8,9,10]]datapd.DataFrame(dict)print(data)for indexs i…

mysql数值比中文检索快_MySQL 千万 级数据量根据(索引)优化 查询 速度

一、索引的作用索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要几十秒甚至更多,5秒以上…

python enumerate函数_Python中enumerate函数用法详解

enumerate函数用于遍历序列中的元素以及它们的下标,多用于在for循环中得到计数,enumerate参数为可遍历的变量,如 字符串,列表等一般情况下对一个列表或数组既要遍历索引又要遍历元素时,会这样写:for i in range (0,len(list)):pri…

mysql5.7.24 安装步骤_MySQL5.7.24解压版安装步骤

网上安装MySQL数据库的教程有.msi格式包安装和.zip格式解压安装,zip安装我个人感觉安装方式纯净又能学习更多知识,因此我更倾向于zip安装。一、下载并解压前往MySQL官网下载5.7.24版本https://dev.mysql.com/downloads/下拉移动看见select Version 选择m…

python在工作中怎么用_如何用python在工作中“偷懒”

原标题:如何用python在工作中“偷懒”“偷懒还能干完活,才是本事 ”有些朋友在工作中会有这样的困惑:明明我从早忙到晚,为什么得到的评价还不高?要知道,企业对一个员工的评价是出于“ 产出”而非“ 付出”。…

mysql utf8mb4 造成慢_mysql使用utf8mb4经验吐血总结

1. utf8 与 utf8mb4 异同1234The character set named utf8 uses a maximum of three bytes per character and contains only BMP characters. The utf8mb4 character set uses a maximum of four bytes per character supports supplementary characters:- For a BMP charact…

java移动接口发短信_Java面试零碎知识点

1.Java文件经过JVM编译成字节码文件,即.class文件,将字节码文件在不同的操作系统中运行时,操作系统再将字节码文件编译成机器码文件。这就是Java跨平台2.首先明确一点,java 的 GC 回收是完全自动的,没有提供相关 api 手…

如何安装mysql5.7.21_Linux 安装MySql 5.7.21 操作步骤

一:到mysql官网下载最新的mysql包 mysql-5.7.21-linux-glibc2.12-x86_64二:在linux /usr/local/中解压mysql压缩包 改名为mysqlcd /usr/local/tar -xzvf mysql压缩包名三:创建用户组mysql,创建用户mysql并将其添加到用户组mysql中…

java重定向代码_Java程序员经典面试题集大全 (三十四)

341. Servlet API中forward() 与redirect()的区别?答:为实现程序的模块化,就需要保证在不同的Servlet之间可以相互跳转,而Servlet中主要有两种实现跳转的方式:FORWARD方式与redirect方式。 Forward() : 是服务器内部的…

mysql用户阻塞数_MySQL实例阻塞分析一例(线程statistics状态)

本文用实例来分析MySQL阻塞—线程statistics状态。一、 现象某日下午下班后低峰期,现网MySQL一个库突然报出大量慢sql,状态是 statistics,但是过后拿这些sql去执行的时候,实际很快。处于 statistics 状态的线程有个特征&#xff1…

无法获取未定义或 null 引用的属性“text”_【CSS】是时候开始用 CSS 自定义属性了...

自定义属性(有时候也被称作CSS变量或者级联变量)是由CSS作者定义的,它包含的值可以在整个文档中重复使用。由自定义属性标记设定值(比如:--main-color: black;),由var() 函数来获取值(比如:color: var(--main-color);)复杂的网站都…

斐波那契数列不用数组_兔子数列——斐波那契数列

相信人们都对斐波那契数列有或多或少的了解,如果没有,那你一定听过黄金分割比或是见过下面这种图片:斐波那契生活在十三世纪的意大利,原名列奥纳多皮萨诺(Leonardo Pisano),他出生在意大利那个后来因为伽里略做过自由落…

sqlserver服务启动失败_条码打印软件连接SQL数据库出现TCP连接失败解决办法

小编今天用条码打印软件连接SQL 数据库遇到了一个问题:通过端口1433连接到主机localhost的TCP/IP连接失败。错误:“Connection refused:connect。请验证连接属性。确保SQL Server的实例正在主机上运行,且在此端口接收TCP/IP连接&a…

python怎么播放mp3_python上播放mp3歌曲

试试这个。它过于简单但可能不是最好的方法。from pygame import mixer # Load the required librarymixer.init()mixer.music.load(e:/LOCAL/Betrayer/Metalik Klinik1-Anak Sekolah.mp3)mixer.music.play()请注意,支持MP3pip install pygame第二种方法试一试使用p…

python语言发明者 google_谷歌的语言何以战胜Python?50%的人都应该立即学习Golang...

全文共2623字,预计学习时长9分钟图源:dailybtc很多软件工程师视Python为最喜爱的语言之一,工作生活都和它死死绑定在一起。但Google, Uber, Dropbox, Soundcloud, Slack, 和Medium的软件工程师并不是这样。长期以来,顶级企业的程序…

python基础文档_python基本文件操作

python文件操作python的文件操作相对于java复杂的IO流简单了好多,只要关心文件的读和写就行了基本的文件操作要注意的是,当不存在某路径的文件时,w,a模式会自动新建此文件夹,当读模式,文件不存在&#xff0…

python如何计算整数和_python 整数和浮点数

Python支持对整数和浮点数直接进行四则混合运算,运算规则和数学上的四则运算规则完全一致。基本的运算:1 2 3 # > 64 * 5 - 6 # > 147.5 / 8 2.1 # > 3.0375使用括号可以提升优先级,这和数学运算完全一致,注意只能使用…

cocoscreator连接MySQL_CocosCreator幼麟麻将搭建步骤

我的客户端和服务器都是在本机Windows8上搭建的,软件环境为:MySQL:5.7Node.js:6.11.0CocosCreator:1.6.2步骤如下:一、服务器环境搭建1、安装MySql数据库(百度)2、登录MySql: mysql –u用户名 –p密码 (登录…

hikaricp mysql_使用 HikariCP 数据源

概述HikariCP是Spring Framework 5.0的默认 数据库连接池,这得益于他的高性能。但是如果配置不当,数据库连接池也可能因影响到系统性能。重要参数maximum-pool-sizeminimum-idlepool-nameauto-commitidle-timeoutmax-lifetimeconnection-timeout初始化过…

return两个返回值_异步函数的两个视角

我们来一起看一下两个程序员之间的故事。以下示例代码是用Scala写的,不过本文所讲的话题并不仅限于Scala,任何有Future/Promise支持的语言都是适用的。下面这个wiki页面罗列了各个有Future/Promise支持的语言,已经涵盖了大多数的常用语言。Fu…