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完全新手教程
Feb 08 Python
python实现划词翻译
Apr 23 Python
Python中使用PyQt把网页转换成PDF操作代码实例
Apr 23 Python
Python判断列表是否已排序的各种方法及其性能分析
Jun 20 Python
使用Python多线程爬虫爬取电影天堂资源
Sep 23 Python
Python爬虫DNS解析缓存方法实例分析
Jun 02 Python
PyQt5组件读取参数的实例
Jun 25 Python
python logging日志模块原理及操作解析
Oct 12 Python
Python selenium抓取虎牙短视频代码实例
Mar 02 Python
python属于解释语言吗
Jun 11 Python
一文轻松掌握python语言命名规范规则
Jun 18 Python
python2和python3哪个使用率高
Jun 23 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 Class&amp;Object -- 解析PHP实现二叉树
2013/06/25 PHP
ThinkPHP分组下自定义标签库实例
2014/11/01 PHP
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
php屏蔽错误及提示的方法
2020/05/10 PHP
有道JavaScript监听浏览器的问题
2010/06/23 Javascript
基于jquery的横向滚动条(滑动条)
2011/02/24 Javascript
jQuery 图片切换插件(代码比较少)
2012/05/07 Javascript
动态的改变IFrame的高度实现IFrame自动伸展适应高度
2012/12/28 Javascript
js异常捕获方法介绍
2013/04/10 Javascript
JS遍历Json字符串中键值对先转成JSON对象再遍历
2014/08/15 Javascript
JS实现三个层重叠点击互相切换的方法
2015/10/06 Javascript
koa-router源码学习小结
2018/09/07 Javascript
Vue.js组件props数据验证实现详解
2019/10/19 Javascript
浅谈vue中组件绑定事件时是否加.native
2019/11/09 Javascript
javascript实现倒计时效果
2020/02/17 Javascript
[47:10]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第二场 12.16
2020/12/18 DOTA
盘点提高 Python 代码效率的方法
2014/07/03 Python
Python在图片中添加文字的两种方法
2017/04/29 Python
django主动抛出403异常的方法详解
2019/01/04 Python
tensorflow之tf.record实现存浮点数数组
2020/02/17 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
2020/09/01 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
2020/09/14 Python
CSS3轻松实现清新 Loading 效果的简单实例
2016/06/06 HTML / CSS
HTML5之SVG 2D入门11—用户交互性(动画)介绍及应用
2013/01/30 HTML / CSS
Pat McGrath Labs官网:世界上最有影响力的化妆师推出的彩妆品牌
2018/01/07 全球购物
大一自我鉴定范文
2013/10/04 职场文书
25岁生日感言
2014/01/13 职场文书
艺术节主持词
2014/04/02 职场文书
公证书标准格式
2014/04/10 职场文书
辛德勒的名单观后感
2015/06/03 职场文书
新闻稿怎么写
2015/07/18 职场文书
2015年防灾减灾工作总结
2015/07/24 职场文书
思品教学工作总结
2015/08/10 职场文书
python接口测试返回数据为字典取值方式
2022/02/12 Python
宫崎骏十大动画电影,宫崎骏好看的动画电影排名
2022/03/22 日漫
ConditionalOnProperty配置swagger不生效问题及解决
2022/06/14 Java/Android