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中的生成器及其与迭代器的差异
Jun 20 Python
使用python实现BLAST
Feb 12 Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
May 18 Python
对django后台admin下拉框进行过滤的实例
Jul 26 Python
深入了解Python在HDA中的应用
Sep 05 Python
Python 动态变量名定义与调用方法
Feb 09 Python
Python 安装 virturalenv 虚拟环境的教程详解
Feb 21 Python
基于pandas向csv添加新的行和列
May 25 Python
python保留格式汇总各部门excel内容的实现思路
Jun 01 Python
如何理解python对象
Jun 21 Python
python3.5的包存放的具体路径
Aug 16 Python
python使用建议与技巧分享(一)
Aug 17 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
在IIS7.0下面配置PHP 5.3.2运行环境的方法
2010/04/13 PHP
php购物车实现代码
2011/10/10 PHP
PHP 循环删除无限分类子节点的实现代码
2013/06/21 PHP
php实现的统计字数函数定义与使用示例
2017/07/26 PHP
PHP基于自定义类随机生成姓名的方法示例
2017/08/05 PHP
JavaScript初学者需要了解10个小技巧
2010/08/25 Javascript
jquery 倒计时效果实现秒杀思路
2013/09/11 Javascript
js获取url中&quot;?&quot;后面的字串方法
2014/05/15 Javascript
javascript实例分享---具有立体效果的图片特效
2014/06/08 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
2016/10/27 Javascript
浅析如何利用angular结合translate为项目实现国际化
2016/12/08 Javascript
vue 2.0组件与v-model详解
2017/03/27 Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
2017/05/27 Javascript
jquery加载单文件vue组件的方法
2017/06/20 jQuery
Vue中父组件向子组件通信的方法
2017/07/11 Javascript
JS实现的加减乘除四则运算计算器示例
2017/08/09 Javascript
Redux 和 Mobx的选择问题:让你不再困惑!
2017/09/18 Javascript
纯javascript前端实现base64图片下载(兼容IE10+)
2018/09/14 Javascript
Vue项目中使用better-scroll实现一个轮播图自动播放功能
2018/12/03 Javascript
vue实现的微信机器人聊天功能案例【附源码下载】
2019/02/18 Javascript
ES6入门教程之let、const的使用方法
2019/04/13 Javascript
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
[56:18]VGJ.S vs Secret 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python内置函数之filter map reduce介绍
2014/11/30 Python
Python保存MongoDB上的文件到本地的方法
2016/03/16 Python
Python自定义装饰器原理与用法实例分析
2018/07/16 Python
python动态进度条的实现代码
2019/07/03 Python
django 环境变量配置过程详解
2019/08/06 Python
django API 中接口的互相调用实例
2020/04/01 Python
Pyinstaller加密打包应用的示例代码
2020/06/11 Python
Django admin组件的使用
2020/10/24 Python
css3实现可滑动跳转的分页插件示例
2014/05/08 HTML / CSS
意大利运动服减价商店:ScontoSport
2020/03/10 全球购物
挂职个人工作总结
2015/03/05 职场文书
优秀的商业计划书,让融资一步到位
2019/05/07 职场文书
Mysql多层子查询示例代码(收藏夹案例)
2022/03/31 MySQL