网上教程一抓一把,跟风来一发。
首先有几个重点:
1.存在过滤器名单中的在过滤过程中一定会被查出来,但是不在名单的也有很小的几率被拦下来
换言之,该拦的都被拦了,不该拦的也可能被拦
操作原理:
对于一个字符串,根据不同的hash函数将Bitvector中的不同位置1,检测时,将一个字符串走相同的n个hash函数,看是不是所有该置为1的部分都被置1了,只要有一个没被置为1,那么这个字符串就没被记录过。
关于误判率之流请见网上各种资料
直接上代码或许更直接?
1 #************************************************************BloomFiter******************************************************** 2 import os 3 import sys 4 from BitVector import BitVector 5 6 class HashGenerator(object):#本类代表一个hash函数,参数是过滤器的总位数,hash的种子 7 def __init__(self, capability,seed): 8 self.capability=capability;#定义过滤器总位数 9 self.seed=seed;#定义这个hash函数的生成种子,关于种子为什么要选质数,请作解答 10 11 def hash(self,value): 12 result=0 13 for i in value: 14 result+=self.seed*result+ord(i)#对字符串内的每个单字计算 15 return (self.capability-1)&result#这个地方是参考来的,没搞明白为毛要做个位与 16 17 class BloomFilter(object): 18 def __init__(self): 19 self.size=1<<25#位运算 20 self.seed=[5,7,11,13,31,37,61]#8个种子,8个hash函数 21 self.hashfunlist=[];#存8个hash类 22 self.container=BitVector(size=self.size)#存下位向量 23 for i in self.seed: 24 self.hashfunlist.append(HashGenerator(self.size,i)) 25 26 def insert(self,value): 27 for item in self.hashfunlist: 28 index=item.hash(value) 29 self.container[index]=1; 30 31 def iscontained(self,value): 32 if value==None: 33 return False 34 for i in range(len(self.seed)): 35 if(self.container[self.hashfunlist[i].hash(value)]==0): 36 return False 37 return True; 38 39 def Test(): 40 testlist=["www.baidu.com",‘www.sina.com‘,‘www.baidu.com‘,‘www.gamersky.com‘,‘www.google.jp‘,‘www.google.jp‘] 41 Filter=BloomFilter() 42 for i in testlist: 43 if Filter.iscontained(i): 44 print("The item is in"+i.__str__()) 45 else: 46 Filter.insert(i) 47 48 Test() 49 50 #************************************************************BloomFiter********************************************************
最后几个问题,留以后解决:
1.hash函数类的那个hash函数生成原理是嘛?还有为什么要用质数做种子?
2.hash类中的那个谜一样的位与是个什么鬼?
3.Vector的大小怎么确定比较好?hash函数的个数怎么判定比较好?数学之美上好像没说。。。。。
时间: 2024-10-12 00:40:18