首页 > 其他分享 >py_bloomfilter.py

py_bloomfilter.py

时间:2023-02-15 13:35:14浏览次数:33  
标签:hash self py redis value hashs bloomfilter math

import mmh3
import redis
import math
import time


class PyBloomFilter():
    #内置100个随机种子
    SEEDS = [543, 460, 171, 876, 796, 607, 650, 81, 837, 545, 591, 946, 846, 521, 913, 636, 878, 735, 414, 372,
             344, 324, 223, 180, 327, 891, 798, 933, 493, 293, 836, 10, 6, 544, 924, 849, 438, 41, 862, 648, 338,
             465, 562, 693, 979, 52, 763, 103, 387, 374, 349, 94, 384, 680, 574, 480, 307, 580, 71, 535, 300, 53,
             481, 519, 644, 219, 686, 236, 424, 326, 244, 212, 909, 202, 951, 56, 812, 901, 926, 250, 507, 739, 371,
             63, 584, 154, 7, 284, 617, 332, 472, 140, 605, 262, 355, 526, 647, 923, 199, 518]

    #capacity是预先估计要去重的数量
    #error_rate表示错误率
    #conn表示redis的连接客户端
    #key表示在redis中的键的名字前缀
    def __init__(self, capacity=1000000000, error_rate=0.00000001, conn=None, key='BloomFilter'):
        self.m = math.ceil(capacity*math.log2(math.e)*math.log2(1/error_rate))      #需要的总bit位数
        self.k = math.ceil(math.log1p(2)*self.m/capacity)                           #需要最少的hash次数
        self.mem = math.ceil(self.m/8/1024/1024)                                    #需要的多少M内存
        self.blocknum = math.ceil(self.mem/512)                                     #需要多少个512M的内存块,value的第一个字符必须是ascii码,所有最多有256个内存块
        self.seeds = self.SEEDS[0:self.k]
        self.key = key
        self.N = 2**31-1
        self.redis = conn
        print(self.mem)
        print(self.k)

    def add(self, value):
        name = self.key + "_" + str(ord(value[0])%self.blocknum)
        hashs = self.get_hashs(value)
        for hash in hashs:
            self.redis.setbit(name, hash, 1)

    def is_exist(self, value):
        name = self.key + "_" + str(ord(value[0])%self.blocknum)
        hashs = self.get_hashs(value)
        exist = True
        for hash in hashs:
            exist = exist & self.redis.getbit(name, hash)
        return exist

    def get_hashs(self, value):
        hashs = list()
        for seed in self.seeds:
            hash = mmh3.hash(value, seed)
            if hash >= 0:
                hashs.append(hash)
            else:
                hashs.append(self.N - hash)
        return hashs


pool = redis.ConnectionPool(host='127.0.0.1', port=6379, db=0)
conn = redis.StrictRedis(connection_pool=pool)

start = time.time()
bf = PyBloomFilter(conn=conn)
bf.add('www.jobbole.com')
bf.add('www.zhihu.com')
print(bf.is_exist('www.zhihu.com'))
print(bf.is_exist('www.lagou.com'))

 

标签:hash,self,py,redis,value,hashs,bloomfilter,math
From: https://www.cnblogs.com/xuchunlin/p/17122473.html

相关文章

  • [经验] 使用python列出文件夹下指定类型的文件
    要列出文件夹下指定类型的文件,可以使用Python的内置模块os和glob。下面是一个列出指定类型文件的示例:importosimportglobfolder_path="/path/to/folder"#文件......
  • python, python3, pip, pip3 的说明
    20230215python:打开系统当前情况下默认command中的pythonpython3:打开python3的版本pip:默认安装在系统当前情况下默认command中的pythonpip3:安装python3的pip......
  • [经验] 使用Python解析Xml文件常用办法(xml库)
    常使用python自带xml库解析xml文件,过程如下:1.使用xml.etree.ElementTree库的ET.parse()函数解析XML文件。2.遍历XML文件中的所有<object>元素,并提取每个对象的类别和......
  • 基于python实现的内网穿透工具 (proxynt)
    内网穿透工具github:https://github.com/sazima/proxynt原理特性随时随地打开浏览器管理端口映射公网服务器和内网客户端之间使用WebSocket加密传输依赖少,使......
  • Idea如何支持写Python代码
    在IDEA中,点击【File】-【Settings...】-【Plugins】,在里面搜索python,并安装插件。(安装后需要重启有效)在IDEA中,配置pythonSDK的路径  (清除红色下划线)【Modules】......
  • python实现一边看图片,一边快速选择分类的脚本
    根据需要,找到了python库——pywinauto根据文档,需要连接或启动相关的app。我选择了连接,第一步错误。app=Application(backend='uia').connect(process='1223')我将数字......
  • 要成为Python大神,需要掌握。。。
    要成为Python大神,需要掌握Python编程语言的基本语法和概念,理解面向对象编程思想,了解Python标准库及其常用模块,熟练使用Python编写程序解决实际问题。以下是一些具体的建议,可......
  • 【python版CV】-直方图 & 傅里叶变换
    文章目录​​1、直方图​​​​mask操作:​​​​shape学习​​​​图像基本运算:​​​​直方图均衡化​​​​2、傅里叶变换​​​​傅里叶变换的作用​​​​滤波:​​​​......
  • 【Python21天学习挑战赛】—Day1:学习规划,我与python的相遇
    大学实验室指导老师说过:“学习是无聊的。没有人说学习是快乐的,那是扯淡!”。是的,学习是无聊的,但是学习到的知识丰富我们自己是快乐的。我喜欢把自己每天所学的知识通过平台分......
  • 【python版CV】图像轮廓&模板匹配
    文章目录​​1、图像轮廓​​​​1.1findContours函数:​​​​1.2获取轮廓信息(可能会报错原因)​​​​1.3绘制轮廓:​​​​1.4轮廓特征:​​​​1.5轮廓近似:​​​​1.6......