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实现ssh批量登录并执行命令
Oct 25 Python
你所不知道的Python奇技淫巧13招【实用】
Dec 14 Python
Python中defaultdict与lambda表达式用法实例小结
Apr 09 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
Jul 25 Python
Python反爬虫技术之防止IP地址被封杀的讲解
Jan 09 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
Mar 01 Python
python爬取基于m3u8协议的ts文件并合并
Apr 26 Python
Python实用库 PrettyTable 学习笔记
Aug 06 Python
Python3.6 中的pyinstaller安装和使用教程
Mar 16 Python
解决python3中os.popen()出错的问题
Nov 19 Python
python 通过 pybind11 使用Eigen加速代码的步骤
Dec 07 Python
基于Python实现nc批量转tif格式
Aug 14 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
全国FM电台频率大全 - 31 新疆维吾尔族自治区
2020/03/11 无线电
搜索和替换文件或目录的一个好类--很实用
2006/10/09 PHP
默默小谈PHP&amp;MYSQL分页原理及实现
2007/01/02 PHP
php实现的常见排序算法汇总
2014/09/08 PHP
php实现网页缓存的工具类分享
2015/07/14 PHP
PHP简单实现无限级分类的方法
2016/05/13 PHP
PHP连接MySQL进行增、删、改、查操作
2017/02/19 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
PHP 超级全局变量相关总结
2020/06/30 PHP
使用JavaScript和C#中获得referer
2014/11/14 Javascript
浅谈JavaScript Math和Number对象
2015/01/26 Javascript
jQuery+Ajax+PHP+Mysql实现分页显示数据实例讲解
2015/09/27 Javascript
javascript设计模式之中介者模式学习笔记
2017/02/15 Javascript
详解闭包解决jQuery中AJAX的外部变量问题
2017/02/22 Javascript
解决React Native端口号修改的方法
2017/07/28 Javascript
vue文件树组件使用详解
2018/03/29 Javascript
NodeJS安装图文教程
2018/04/19 NodeJs
js用正则表达式筛选年月日的实例方法
2021/01/04 Javascript
Python常见读写文件操作实例总结【文本、json、csv、pdf等】
2019/04/15 Python
python获取磁盘号下盘符步骤详解
2019/06/19 Python
python读出当前时间精度到秒的代码
2019/07/05 Python
python绘制分布折线图的示例
2020/09/24 Python
Python爬虫定时计划任务的几种常见方法(推荐)
2021/01/15 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
2021/03/03 Python
培训讲师邀请函
2014/01/10 职场文书
大型车展策划方案
2014/02/01 职场文书
预备党员表决心书
2014/03/11 职场文书
《秋游》教学反思
2014/04/24 职场文书
学习雷锋标语
2014/06/25 职场文书
个人年终总结怎么写
2015/03/09 职场文书
女性健康知识讲座通知
2015/04/23 职场文书
龙猫观后感
2015/06/09 职场文书
新闻稿件写作范文
2015/07/18 职场文书
2016新年感言
2015/08/03 职场文书
Python机器学习之基础概述
2021/05/19 Python
深入理解margin塌陷和margin合并的解决方案
2021/06/26 HTML / CSS