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 自动补全(vim)
Nov 30 Python
MySQL中表的复制以及大型数据表的备份教程
Nov 25 Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
Oct 01 Python
Python语言实现百度语音识别API的使用实例
Dec 13 Python
详解python3中的真值测试
Aug 13 Python
Python对CSV、Excel、txt、dat文件的处理
Sep 18 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
Sep 25 Python
python+os根据文件名自动生成文本
Mar 21 Python
Django密码系统实现过程详解
Jul 19 Python
Python箱型图绘制与特征值获取过程解析
Oct 22 Python
python shutil文件操作工具使用实例分析
Dec 25 Python
上手简单,功能强大的Python爬虫框架——feapder
Apr 27 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 向访客和爬虫显示不同的内容
2009/11/09 PHP
PHP中SESSION的注销与清除
2015/04/16 PHP
Laravel中使用FormRequest进行表单验证方法及问题汇总
2016/06/19 PHP
php实现URL加密解密的方法
2016/11/17 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
2017/07/26 PHP
PHP实现简单登录界面
2019/10/23 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
js获得当前时区夏令时发生和终止的时间代码
2014/02/23 Javascript
Ext修改GridPanel数据和字体颜色、css属性等
2014/06/13 Javascript
如何让你的Lightbox支持滚轮缩放及Base64图片
2014/12/04 Javascript
JQuery实现动态适时改变字体颜色的方法
2015/03/10 Javascript
浅谈jQuery.easyui的datebox格式化时间
2015/06/25 Javascript
深入学习 JavaScript中的函数调用
2017/03/23 Javascript
AngularJS 实现点击按钮获取验证码功能实例代码
2017/07/13 Javascript
js 发布订阅模式的实例讲解
2017/09/10 Javascript
Vue添加请求拦截器及vue-resource 拦截器使用
2017/11/23 Javascript
JS/jQuery实现DIV延时几秒后消失或显示的方法
2018/02/12 jQuery
JavaScript生成指定范围的时间列表
2018/03/19 Javascript
详细讲解如何创建, 发布自己的 Vue UI 组件库
2019/05/29 Javascript
vue.js自定义组件实现v-model双向数据绑定的示例代码
2020/01/08 Javascript
jQuery实现开关灯效果
2020/08/02 jQuery
使用Python简单的实现树莓派的WEB控制
2016/02/18 Python
python爬虫租房信息在地图上显示的方法
2019/05/13 Python
python移位运算的实现
2019/07/15 Python
tensorflow常用函数API介绍
2020/04/19 Python
python里的单引号和双引号的有什么作用
2020/06/17 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
2020/07/14 Python
python matplotlib库的基本使用
2020/09/23 Python
Manjaro、pip、conda更换国内源的方法
2020/11/17 Python
详解python日志输出使用配置文件格式
2021/02/10 Python
html5实现完美兼容各大浏览器的播放器
2014/12/26 HTML / CSS
销售高级职员求职信
2013/10/29 职场文书
工作收入证明模板
2015/06/12 职场文书
手术室消毒隔离制度
2015/08/05 职场文书
表扬信范文
2019/04/22 职场文书
Nginx中使用Lua脚本与图片的缩略图处理的实现
2022/03/18 Servers