布隆过滤器的python实现
来源:互联网 发布:java线程详解 编辑:程序博客网 时间:2024/05/26 17:49
这篇文章参考了以下博客:
http://www.cnblogs.com/allensun/archive/2011/02/16/1956532.html (布隆过滤器的数学证明和模型)
http://palydawn.blog.163.com/blog/static/182969056201210260470485/
还有一篇实在是找不到了,如果那位作者觉得自己的代码跟我的这个很像,那就是我从你那里改的,请联系我我会把你的博客加上去。
这个代码根据布隆过滤器的数学模型,设置错误概率是0.001也就是0.1%,求出所需的bitvector大小和所需要的hash函数的个数n,再使用素数筛法求出从5开始的n个素数用来作为哈希的种子。至于这个哈希函数,使用的是bkdrhash算法,相关资料就不详尽列举了。
#!/usr/bin/python#coding=utf-8import BitVectorimport cmathimport randomdef is_prime(n): if n == 9: return False for i in range(3,int(n**0.5)): if n%i == 0: return False return Truedef find_prime( n ): #找到从5开始的n个素书,使用素书筛法 prime = [] i = 5 while len(prime) != n: flag = False for j in prime: if i % j == 0: flag = True i += 1 break if flag: #如果能被素书整除就跳过一轮循环 continue if is_prime(i): prime.append(i) i += 1 return primeclass SimpleHash(): #这里使用了bkdrhash的哈希算法 def __init__(self, cap, seed): self.cap = cap self.seed = seed def hash(self, value): ret = 0 for i in range(len(value)): ret += self.seed*ret + ord(value[i]) return (self.cap-1) & ret #控制哈系函数的值域class Bloom_Filter(): ''' 类名是Bloom_Fileter,初始化时传入数据的数量 mark_value 函数是用于标记值的函数,应传入想要标记的值 exists 函数是用于检测某个值是否已经被标记的函数,应传入想要检测的值''' def __init__(self, amount = 1 << 26): self.container_size = (-1) * amount * cmath.log(0.001) / (cmath.log(2) * cmath.log(2)) #计算最佳空间大小 self.container_size = int(self.container_size.real) #取整 self.hash_amount = cmath.log(2) * (self.container_size) / (amount) self.hash_amount = int(self.hash_amount.real) self.container = BitVector.BitVector(size = int(self.container_size)) #分配内存 self.hash_seeds = find_prime(self.hash_amount) self.hash = [] for i in range(int(self.hash_amount)): #生成哈希函数 self.hash.append(SimpleHash(self.container_size, self.hash_seeds[i])) print self.container_size return def exists(self, value): '''存在返回真,否则返回假''' if value == None: return False for func in self.hash : if self.container[func.hash(str(value))] == 0 : return False return True def mark_value(self, value): '''value是要标记的元素''' for func in self.hash : self.container[func.hash(str(value))] = 1 return
1 0
- 布隆过滤器的python实现
- Python实现布隆过滤器
- 布隆过滤器Python代码实现
- 【布隆过滤器】实现一个简单的布隆过滤器
- 【布隆过滤器】实现一个简单的布隆过滤器
- python实现布隆过滤器对数据去重
- 布隆过滤器(Bloom Filter)原理及python实现
- 实现布隆过滤器
- 布隆过滤器的简易实现
- BloomFilter(布隆过滤器)的C#实现
- 布隆过滤器(BloomFilter)的实现
- BloomFilter布隆过滤器的java实现
- 布隆过滤器的实现及其优缺点
- 布隆过滤器java实现
- 布隆过滤器:实现代码
- 布隆过滤器及其实现
- 实现一个布隆过滤器
- 基于Redis的布隆过滤器的实现
- Java按字节长度截取字符串
- Apple Swift
- 简单创建存储过程范例
- 基于cell-base的NSTableView
- Linux快捷键
- 布隆过滤器的python实现
- Swing开发时必定会碰到的11个问题及解决方案
- 十六进制转八进制
- linux常用命令
- Java语言中Timer类的简洁用法
- 借助网盘搭建SVN服务器
- 怎么判断一个关键词的难度
- GCM结构概述-GCM Architectural Overview
- 中文Ubuntu里用户目录里的路径改成英文