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 布尔操作实现代码
Mar 23 Python
python使用paramiko实现远程拷贝文件的方法
Apr 18 Python
python批量添加zabbix Screens的两个脚本分享
Jan 16 Python
Django实现简单分页功能的方法详解
Dec 05 Python
padas 生成excel 增加sheet表的实例
Dec 11 Python
python安装scipy的步骤解析
Sep 28 Python
python程序文件扩展名知识点详解
Feb 27 Python
Python unittest 自动识别并执行测试用例方式
Mar 09 Python
python 代码运行时间获取方式详解
Sep 18 Python
Python通过getattr函数获取对象的属性值
Oct 16 Python
Python学习之time模块的基本使用
Jan 17 Python
如何用tempfile库创建python进程中的临时文件
Jan 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
php实现自动获取生成文章主题关键词功能的深入分析
2013/06/03 PHP
php strrpos()与strripos()函数
2013/08/31 PHP
从刷票了解获得客户端IP的方法
2015/09/21 PHP
PHP环境中Memcache的安装和使用
2015/11/05 PHP
PHP后期静态绑定之self::限制实例分析
2018/12/21 PHP
iframe异步加载实现点击左边菜单加载右边内容实例讲解
2013/03/04 Javascript
JQuery触发事件例如click
2013/09/11 Javascript
Linux下为Node.js程序配置MySQL或Oracle数据库的方法
2016/03/19 Javascript
jQuery简单注册和禁用全局事件的方法
2016/07/25 Javascript
JavaScript微信定位功能实现方法
2016/11/29 Javascript
vue-router路由简单案例介绍
2017/02/21 Javascript
使用js实现将后台传入的json数据放在前台显示
2018/08/06 Javascript
Vue 后台管理类项目兼容IE9+的方法示例
2019/02/20 Javascript
node.js域名解析实现方法详解
2019/11/05 Javascript
通过高德地图API获得某条道路上的所有坐标用于描绘道路的方法
2020/08/24 Javascript
Python字符串替换实例分析
2015/05/11 Python
python实现的系统实用log类实例
2015/06/30 Python
MySQL适配器PyMySQL详解
2017/09/20 Python
Python建立Map写Excel表实例解析
2018/01/17 Python
python采集微信公众号文章
2018/12/20 Python
Python PyQt5 Pycharm 环境搭建及配置详解(图文教程)
2019/07/16 Python
Python类中self参数用法详解
2020/02/13 Python
Python中的整除和取模实例
2020/06/03 Python
Canvas绘制浮动球效果的示例
2017/12/29 HTML / CSS
canvas学习和滤镜实现代码
2018/08/22 HTML / CSS
美国在线鞋类零售商:LifeStride
2019/06/09 全球购物
门诊手术室工作制度
2014/01/30 职场文书
销售团队口号大全
2014/06/06 职场文书
部门活动策划方案
2014/08/16 职场文书
2014年四风个人对照检查及整改措施
2014/10/28 职场文书
小学教师个人总结
2015/02/05 职场文书
体育教师个人总结
2015/02/09 职场文书
北京英文导游词
2015/02/12 职场文书
python工具dtreeviz决策树可视化和模型可解释性
2022/03/03 Python
mysql 获取相邻数据项
2022/05/11 MySQL
Java中的Kotlin 内部类原理
2022/06/16 Java/Android