python使用布隆过滤器的实现示例


Posted in Python onAugust 20, 2020

使用库pybloom_live

from pybloom_live import ScalableBloomFilter,BloomFilter

# 可自动伸缩的布隆过滤器
bloom = ScalableBloomFilter(initial_capacity=100,error_rate=0.001)

# 添加内容
bloom.add('daqi')
print('daqi'in bloom)

# 定长的布隆过滤器
bloom1 = BloomFilter(capacity=10000)
bloom1.add('daqi')
print('daqi'in bloom1)

手动实现一个简单的布隆过滤器

使用bitarray实现,将初始数组置为0,根据hash计算出节点置为1,同时写了一个生成随机码的函数用于测试。

import random
import mmh3
from bitarray import bitarray
import os.path
import re


# bitarray长度
BIT_SIZE = 50000

class BloomFilter():

  def __init__(self):
    bit_array = bitarray(BIT_SIZE)
    bit_array.setall(0)
    self.bit_array = bit_array
    self.bit_size = self.length()


  def get_points(self, url):
    """
    生成需要插入的位置
    :param url:
    :return:节点的列表
    """
    point_list = []
    for i in range(7):
      point = mmh3.hash(url,30+i) % self.bit_size
      point_list.append(point)
    return point_list

  def add(self, url):
    """
    添加url到bitarray中
    :param url:
    :return:
    """
    res = self.bitarray_expand()
    points = self.get_points(url)
    try:
      for point in points:
        self.bit_array[point] = 1
      return '注册完成!'
    except Exception as e:
      return e

  def contains(self,url):
    """
    验证url是否存在
    :param url:
    :return:True or False
    """
    points = self.get_points(url)
    # 在bitarray中查找对应的点,如果有一个点值为0就说明该url不存在
    for p in points:
      if self.bit_array[p] == 0:
        return False
    return True


  def count(self):
    """
    获取bitarrray中使用的节点数
    :return: bitarray长度
    """
    return self.bit_array.count()


  def length(self):
    """
    获取bitarray的长度
    :return:bitarray的长度
    """
    return len(self.bit_array)


  def bitarray_expand(self):
    """
    扩充bitarray长度
    :return:bitarray的长度或使用率,布隆过滤器的bitarray的使用最好不要超过50%,这样误判率低一些
    """
    isusespace = round(int(self.count()) / int(self.length()),4)
    if 0.50 < isusespace:
      # 新建bitarray
      expand_bitarray = bitarray(BIT_SIZE)
      expand_bitarray.setall(0)
      # 增加新建的bitarray
      self.bit_array = self.bit_array + expand_bitarray
      self.bit_size = self.length()
      return self.bit_size
    else:
      return f'长度尚可,{round(isusespace * 100,2)}%'



def get_captcha():
  """
  生成用于测试的随机码
  :return:
  """
  seed = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
  captcha = ""
  for i in range(10):
    captcha += random.choice(seed)
  print(captcha)
  return captcha


if __name__ == '__main__':
  bloom = BloomFilter()
  for i in range(100000):
    bloom.add(f'www.{get_captcha()}.com')
    print(bloom.length())
    print(bloom.count())
  print(bloom.count())

到此这篇关于python使用布隆过滤器的实现示例的文章就介绍到这了,更多相关python 布隆过滤器内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python写的一个文本编辑器
Jan 23 Python
Python的requests网络编程包使用教程
Jul 11 Python
Python实现拷贝多个文件到同一目录的方法
Sep 19 Python
python中lambda()的用法
Nov 16 Python
python 多线程中子线程和主线程相互通信方法
Nov 09 Python
Mac在python3环境下安装virtualwrapper遇到的问题及解决方法
Jul 09 Python
Django框架视图介绍与使用详解
Jul 18 Python
python设置随机种子实例讲解
Sep 12 Python
python中re模块知识点总结
Jan 17 Python
Python insert() / append() 用法 Leetcode实战演示
Mar 31 Python
django学习之ajax post传参的2种格式实例
May 14 Python
Python使用OpenCV实现虚拟缩放效果
Feb 28 Python
QT5 Designer 打不开的问题及解决方法
Aug 20 #Python
Python配置pip国内镜像源的实现
Aug 20 #Python
Python使用lambda抛出异常实现方法解析
Aug 20 #Python
浅谈对python中if、elif、else的误解
Aug 20 #Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
Aug 20 #Python
Python自动化测试中yaml文件读取操作
Aug 20 #Python
通过代码实例解析Pytest运行流程
Aug 20 #Python
You might like
xml+php动态载入与分页
2006/10/09 PHP
利用递归把多维数组转为一维数组的函数
2006/10/09 PHP
php常用Output和ptions/Info函数集介绍
2013/06/19 PHP
php从字符串创建函数的方法
2015/03/16 PHP
PHP环境搭建(php+Apache+mysql)
2016/11/14 PHP
PHP 构造函数和析构函数原理与用法分析
2020/04/21 PHP
PHP如何开启Opcache功能提升程序处理效率
2020/04/27 PHP
JavaScript开发规范要求(规范化代码)
2010/08/16 Javascript
JQuery获取与设置HTML元素的内容或文本的实现代码
2014/06/20 Javascript
js实现完美兼容各大浏览器的人民币大小写相互转换
2015/10/29 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
2016/03/30 Javascript
Extjs4.0 ComboBox如何实现三级联动
2016/05/11 Javascript
javaScript知识点总结(必看篇)
2016/06/10 Javascript
Node.js与MySQL交互操作及其注意事项
2016/10/05 Javascript
浅述Javascript的外部对象
2016/12/07 Javascript
Angular5给组件本身的标签添加样式class的方法
2018/04/07 Javascript
Node.js API详解之 querystring用法实例分析
2020/04/29 Javascript
Element Input输入框的使用方法
2020/07/26 Javascript
JavaScript文档加载模式以及元素获取
2020/07/28 Javascript
前端vue+elementUI如何实现记住密码功能
2020/09/20 Javascript
Python内置函数Type()函数一个有趣的用法
2015/02/18 Python
Python多进程分块读取超大文件的方法
2016/04/13 Python
Python中单、双下划线的区别总结
2017/12/01 Python
对python产生随机的二维数组实例详解
2018/12/13 Python
CentOS7安装Python3的教程详解
2019/04/10 Python
python3读取csv文件任意行列代码实例
2020/01/13 Python
Python调用.net动态库实现过程解析
2020/06/05 Python
python如何导入依赖包
2020/07/13 Python
联想中国官方商城:Lenovo China
2017/10/18 全球购物
一篇.NET面试题
2014/09/29 面试题
新闻专业大学生找工作的自我评价
2013/10/30 职场文书
应届毕业生求职信范文
2013/12/18 职场文书
课前一分钟演讲稿
2014/08/26 职场文书
大学迎新生标语
2014/10/06 职场文书
2016大学迎新晚会开场白
2015/11/24 职场文书
vue router 动态路由清除方式
2022/05/25 Vue.js