Scala使用MurmurHash3实现简单的BloomFilter
来源:互联网 发布:java rpc实现 编辑:程序博客网 时间:2024/04/29 09:13
布隆过滤器用于检测某个值是否已经存在,应用场景很广泛,比如在Hbase中可以在ROW(行级)或ROWCOL(行+列)两个级别配置是否开启布隆过滤器。其作用是反向检测某个数据是否存在于某个数据块,检测结果确定为不存在或不确定。只有对不存在的判断是确切的,因为BloomFilter对存在的判断具有一定的误判率。BloomFilter将待处理的数据经过N个hash函数映射到一个Bit数组的N个值,hash值则为Bit数组的索引项。经过处理,如果一个值已经存在,那么必定满足Bit[Hi] == true 其中i为1到N,Hi为使用第i个hash函数得到的hash值,Bit为位数组。
在实现一般的网络爬虫的时候也可以考虑添加BloomFilter功能来过滤已爬取的网页。下面的代码为使用Scala util包下的MurmurHash3实现的BloomFilter。
import java.util.BitSetimport scala.util.hashing.MurmurHash3/** * 实现简单的bloomfilter过滤器,用来判断某个url是否已经被爬取 */object BloomFilter { /** 1 << 24位长度的位图数组,存放hash值*/ val bitSetSize = 1 << 32 /**位数组*/ val bitSet = new BitSet(bitSetSize) /**传入murmurhash中的seed的范围*/ val seedNums = 6 /** * 根据MurmurHash3计算哈希值,设置BitSet的值 * @param str */ def hashValue(str: String): Unit = { if(str != null && !str.isEmpty) for(i <- 1 to seedNums) bitSet.set(Math.abs(MurmurHash3.stringHash(str, i)) % bitSetSize, true) else println("传入的字符串位空") } /** * 判断一个字符串是否存在于bloomFilter * @param str * @return */ def exists(str: String): Boolean = { def existsRecur(str: String, seed: Int): Boolean = { if(str == null || str.isEmpty) false else if(seed > seedNums) true else if(!bitSet.get(Math.abs(MurmurHash3.stringHash(str, seed)) % bitSetSize)) false else existsRecur(str, seed + 1) } if(str == null || str.isEmpty) false else existsRecur(str, 1) } def main(args: Array[String]) = { val s1 = "www.baidu.com" val s2 = "www.jd.com" val s3 = "www.taobao.com" val s4 = "http://kafka.apache.org" BloomFilter.hashValue(s1) BloomFilter.hashValue(s2) BloomFilter.hashValue(s3) BloomFilter.hashValue(s4) println(BloomFilter.exists(s1)) println(BloomFilter.exists(s2)) println(BloomFilter.exists(s3)) println(BloomFilter.exists(s4)) }}
阅读全文
0 0
- Scala使用MurmurHash3实现简单的BloomFilter
- python 实现的简单的BloomFilter
- BloomFilter的一个简单实现(C语言)
- 使用scala实现wordcount的简单计数
- bloomfilter的实现
- MurmurHash3
- BloomFilter过滤器过滤算法的简单实现(学习笔记)
- 使用bloomfilter
- BloomFilter(布隆过滤器)的C#实现
- 布隆过滤器(BloomFilter)的实现
- BloomFilter布隆过滤器的java实现
- 简单的scala实现的网络爬虫
- PageRank的简单实现(scala版)
- scala 实现简单的RPC通信流程
- Scala结合HttpClient实现简单的爬虫
- scala 实现简单爬虫
- BloomFilter应用与D-Lelft BloomFilter实现
- 浅谈BloomFilter【下】用Java实现BloomFilter
- jQuery选择器
- PTA 02-线性结构2 一元多项式的乘法与加法运算
- 存储,分享积累 CockroachDB
- RecyclerView只有一行数据的解决方案
- Servlet(11)—客户端跳转和服务端跳转
- Scala使用MurmurHash3实现简单的BloomFilter
- hdu 6199 dp
- LeetCode 283. Move Zeroes (Easy)
- Android中Maternal Design设计中将ToolBar代替ActionBar
- Brute Force Sorting 链表\模拟 [2017 ACM/ICPC Asia Regional Qingdao Online]
- UI设计实践优化
- Android用Gson解析Json,我怎么用就怎么写!
- shell脚本批量导入数据到oracle数据库
- python股票数据爬虫requests、etree、BeautifulSoup学习