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单例模式实例分析
Jan 14 Python
Python的迭代器和生成器
Jul 29 Python
matplotlib简介,安装和简单实例代码
Dec 26 Python
python+opencv实现动态物体追踪
Jan 09 Python
python读文件保存到字典,修改字典并写入新文件的实例
Apr 23 Python
在Mac上删除自己安装的Python方法
Oct 29 Python
python2和python3的输入和输出区别介绍
Nov 20 Python
django-allauth入门学习和使用详解
Jul 03 Python
Pycharm配置PyQt5环境的教程
Apr 02 Python
python实现移动木板小游戏
Oct 09 Python
Python中tqdm的使用和例子
Sep 23 Python
python index() 与 rindex() 方法的使用示例详解
Dec 24 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 CURL CURLOPT参数说明(curl_setopt)
2013/09/30 PHP
php返回当前日期或者指定日期是周几
2015/05/21 PHP
thinkphp制作404跳转页的简单实现方法
2016/09/22 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
2016/10/08 PHP
JQuery 无废话系列教程(二) jquery实战篇上
2009/06/23 Javascript
javascript学习之闭包分析
2010/12/02 Javascript
jquery.cookie.js 操作cookie实现记住密码功能的实现代码
2011/04/27 Javascript
js键盘上下左右键怎么触发function(实例讲解)
2013/12/14 Javascript
SinaEditor使用方法详解
2013/12/28 Javascript
解决JS中乘法的浮点错误的方法
2014/01/03 Javascript
jquery ajax传递中文参数乱码问题及解决方法说明
2014/02/07 Javascript
form.submit()不能提交表单的原因分析
2014/10/23 Javascript
Node.js的特点和应用场景介绍
2014/11/04 Javascript
浅析JS运动
2015/12/28 Javascript
Angularjs 滚动加载更多数据
2016/03/17 Javascript
Bootstrap框架结合jQuery仿百度换肤功能实例解析
2016/09/17 Javascript
js仿手机页面文件下拉刷新效果
2016/10/14 Javascript
tablesorter.js表格排序使用方法(支持中文排序)
2017/02/10 Javascript
js代码延迟一定时间后执行一个函数的实例
2017/02/15 Javascript
如何理解Vue的v-model指令的使用方法
2018/07/19 Javascript
解决在Vue中使用axios用form表单出现的问题
2019/10/30 Javascript
vue封装可复用组件confirm,并绑定在vue原型上的示例
2019/10/31 Javascript
微信小程序中使用 async/await的方法实例分析
2020/05/06 Javascript
[04:28]2014DOTA2国际邀请赛 采访小兔子LGD挺进钥匙体育馆
2014/07/14 DOTA
python类定义的讲解
2013/11/01 Python
python通过cookie模拟已登录状态的初步研究
2016/11/09 Python
基于python元祖与字典与集合的粗浅认识
2017/08/23 Python
Python OpenCV处理图像之图像直方图和反向投影
2018/07/10 Python
python Selenium实现付费音乐批量下载的实现方法
2019/01/24 Python
Python3将ipa包中的文件按大小排序
2020/04/17 Python
利用PyTorch实现VGG16教程
2020/06/24 Python
吃透移动端 Html5 响应式布局
2019/12/16 HTML / CSS
寒假思想汇报
2014/01/10 职场文书
差生评语大全
2014/05/04 职场文书
建筑工程质量通病防治方案
2014/06/08 职场文书
心灵捕手观后感
2015/06/02 职场文书