作者:吴军
第23章 布隆过滤器
存储效率
采用散列表,每存储一亿个Email地址,就需要1.6GB的内存,即16亿字节(B)的内存。
1B(byte,字节)= 8 bit(见下文);
(用散列表实现的具体办法是将每一个Email地址对应成一个8字节的信息指纹,然后将这些信息指纹存入散列表,由于散列表的存储效率一般只有50%,因此一个Email地址需要占用16个字节)
布隆过滤器工作原理
建立黑名单:
假定存储一亿个黑名单电子邮件地址,先建立一个16亿个比特位即两亿字节的向量,然后将这16亿个比特位全部清零。对于每一个电子邮件地址X,用8个不同的随机数产生器(F1,F2,...F8)产生8个信息指纹(f1,f2,...f8)。再用一个随机数产生器G把这8个信息指纹映射到1-16亿中的8个自然数g1,g2...g8。现在把这8个位置的比特位全部设置为1。
检测:
检测可疑的电子邮件Y是否在黑名单中。用相同的8个随机数产生器(F1,F2,...F8)对这个地址产生的8个信息指纹s1,s2,...s8,然后将这8个指纹对应到布隆过滤器的8个比特位,分别是t1,t2,...t8。如果Y在黑名单中,显然,t1,t2,...t8对应的8个比特位一定是1。
总结:
布隆过滤器的好处在于快速、省空间,但是有一定的误识别率。常见的补救方法是再建立一个小的白名单,存储那些可能被误判的邮件地址。
备注:
B与bit
数据存储是以“字节”(Byte)为单位,数据传输大多是以“位”(bit,又名“比特”)为单位,一个位就代表一个0或1(即二进制),每8个位(bit,简写为b)组成一个字节(Byte,简写为B),是最小一级的信息单位。
数据类型
Byte数据类型(字节型)用一个字节(Byte)储存,可区别256个数字,取值范围:0到255。 Byte是从0-255的无符号类型,所以不能表示负数。具体参照数据类型。