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 25 Python
简单介绍Python中的filter和lambda函数的使用
Apr 07 Python
Django查询数据库的性能优化示例代码
Sep 24 Python
基于python(urlparse)模板的使用方法总结
Oct 13 Python
Python随机生成均匀分布在单位圆内的点代码示例
Nov 13 Python
对python 多个分隔符split 的实例详解
Dec 20 Python
django框架模板中定义变量(set variable in django template)的方法分析
Jun 24 Python
python爬虫 基于requests模块发起ajax的get请求实现解析
Aug 20 Python
利用Python绘制有趣的万圣节南瓜怪效果
Oct 31 Python
python神经网络编程实现手写数字识别
May 27 Python
python获取整个网页源码的方法
Aug 03 Python
python 递归相关知识总结
Mar 03 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
从一个不错的留言本弄的mysql数据库操作类
2007/09/02 PHP
php Sql Server连接失败问题及解决办法
2009/08/07 PHP
php中spl_autoload详解
2014/10/17 PHP
PHP生成指定随机字符串的简单实现方法
2015/04/01 PHP
ajax+php控制所有后台函数调用
2015/07/15 PHP
必须收藏的23个php实用代码片段
2016/02/02 PHP
php封装的验证码工具类完整实例
2016/10/19 PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
2017/08/11 PHP
jquery 跨域访问问题解决方法(笔记)
2011/06/08 Javascript
JavaScript对IE操作的经典代码(推荐)
2014/03/10 Javascript
js 左右悬浮对联广告代码示例
2014/12/12 Javascript
jQuery 中DOM 操作详解
2015/01/13 Javascript
jQuery position() 函数详解以及jQuery中position函数的应用
2015/12/14 Javascript
jQuery隐藏和显示效果实现
2016/04/06 Javascript
JavaScript反弹动画效果的实现代码
2017/07/13 Javascript
纯js实现页面返回顶部的动画(超简单)
2017/08/10 Javascript
详解JavaScript的BUG和错误
2018/05/07 Javascript
使用Sonarqube扫描Javascript代码的示例
2018/12/26 Javascript
微信小程序动态添加和删除组件的现实
2020/02/28 Javascript
Vue实现购物小球抛物线的方法实例
2020/11/22 Vue.js
在ironpython中利用装饰器执行SQL操作的例子
2015/05/02 Python
Python使用自带的ConfigParser模块读写ini配置文件
2016/06/26 Python
python去掉行尾的换行符方法
2017/01/04 Python
Python中的连接符(+、+=)示例详解
2017/01/13 Python
Python GUI布局尺寸适配方法
2018/10/11 Python
Python实现点阵字体读取与转换的方法
2019/01/29 Python
Python 中 -m 的典型用法、原理解析与发展演变
2019/11/11 Python
将python包发布到PyPI和制作whl文件方式
2019/12/25 Python
python3连接mysql获取ansible动态inventory脚本
2020/01/19 Python
Python使用graphviz画流程图过程解析
2020/03/31 Python
Soft Cotton捷克:来自爱琴海棉花的浴袍
2017/02/01 全球购物
外贸业务员工作职责
2014/01/06 职场文书
企业贷款委托书格式
2014/09/12 职场文书
中学生2014国庆节演讲稿:不屈的民族
2014/09/21 职场文书
上诉状格式
2015/05/23 职场文书
2019经典广告词集锦!
2019/07/02 职场文书