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 相关文章推荐
pymongo实现控制mongodb中数字字段做加法的方法
Mar 26 Python
使用paramiko远程执行命令、下发文件的实例
Oct 01 Python
python3.x 将byte转成字符串的方法
Jul 17 Python
python粘包问题及socket套接字编程详解
Jun 29 Python
opencv转换颜色空间更改图片背景
Aug 20 Python
Django框架中间件定义与使用方法案例分析
Nov 28 Python
Python基本类型的连接组合和互相转换方式(13种)
Dec 16 Python
Python 音频生成器的实现示例
Dec 24 Python
python 实现Flask中返回图片流给前端展示
Jan 09 Python
Python selenium模拟手动操作实现无人值守刷积分功能
May 13 Python
解决Python Matplotlib绘图数据点位置错乱问题
May 16 Python
了解一下python内建模块collections
Sep 07 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
深入了解 register_globals (附register_globals=off 网站打不开的解决方法)
2012/06/27 PHP
PHP curl 并发最佳实践代码分享
2012/09/05 PHP
PHP设计模式之装饰者模式代码实例
2015/05/11 PHP
php 利用array_slice函数获取随机数组或前几条数据
2015/09/30 PHP
深入理解PHP 数组之count 函数
2016/06/13 PHP
PHP PDOStatement::execute讲解
2019/01/31 PHP
[HTML/CSS/Javascript]WWTJS
2007/09/25 Javascript
关于IE浏览器以及Firefox下的javascript冒泡事件的响应层级
2010/10/14 Javascript
JS 面向对象之神奇的prototype
2011/02/26 Javascript
jquery Moblie入门—hello world的示例代码学习
2013/01/08 Javascript
js获取对象为null的解决方法
2013/11/21 Javascript
javascript制作loading动画效果 loading效果
2014/01/14 Javascript
jQuery+CSS3实现树叶飘落特效
2015/02/01 Javascript
javascript中 try catch用法
2015/08/16 Javascript
详解vue.js2.0父组件点击触发子组件方法
2017/05/10 Javascript
three.js中文文档学习之通过模块导入
2017/11/20 Javascript
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
2015/04/08 Python
Python编程之多态用法实例详解
2015/05/19 Python
详解Python中类的定义与使用
2017/04/11 Python
详解python多线程、锁、event事件机制的简单使用
2018/04/27 Python
解决Python print输出不换行没空格的问题
2018/11/14 Python
Python正则表达式匹配和提取IP地址
2019/06/06 Python
python numpy库linspace相同间隔采样的实现
2020/02/25 Python
Python之变量类型和if判断方式
2020/05/05 Python
Python是什么 Python的用处
2020/05/26 Python
Python中的With语句的使用及原理
2020/07/29 Python
如何基于python把文字图片写入word文档
2020/07/31 Python
Python监听键盘和鼠标事件的示例代码
2020/11/18 Python
Omio俄罗斯:一次搜索公共汽车、火车和飞机的机票
2018/11/17 全球购物
Redbubble法国:由独立艺术家设计的独特产品
2019/01/08 全球购物
Right-on官方网站:日本知名的休闲服装品牌
2019/07/12 全球购物
学期研究性学习个人的自我评价
2014/01/09 职场文书
消防安全责任书范本
2014/04/15 职场文书
2015年学校消防安全工作总结
2015/10/14 职场文书
Python自动化实战之接口请求的实现
2022/05/30 Python