布隆过滤器 redis_redis位图-布隆过滤器

背景

一个网址大概上百个字符,大约0.1KB,
如果是一亿个网址,就需要10GB了,如
果是一百亿一千亿呢?显然这么大的规
模就很麻烦了,今天要介绍的布隆过滤
器就可以解决这个问题,而且不需要存
储下原值

原理

布隆过滤器本身的结构非常简单,就是一个一维的 bool 型的数组,刚开始的时候数组内全部都是 0,这个数组的长度是 m。对于每个新增的项,我们使用K种不同的hash算法对它计算hash值,可以得到 K 个 hash 值,我们再用这些 hash 值对 m 取模映射到数组范围内,假设是 x,最后我们把所有 x 对应的位置标记为 1。举个例子,假设我们一开始m是10,K是3。我们遇到第一个插入的数据是”线性代数“,我们对它hash之后得到1,3,5,那么我们将对应的位置标记成1.

37420f37928836a40db59c244571bbe5.png

然后我们又遇到了一个数据是”高等数学“,hash之后得到1,8,9,我们还是将对应位置赋值成1,会发现1这个位置对应的值已经是1了,我们忽略就好。

5742a50ebf95e41c1a974942713bf938.png

如果这个时候我们想要判断”概率统计”有没有出现过,怎么办?很简单,我们对“概率统计”再计算hash值。假设得到1,4,5,我们去遍历一下对应的位置,发现4这个位置是0,说明之前没有添加过“概率统计”,显然“概率统计”没有出现过。但是如果“概率统计”hash之后的结果是1,3,8呢?我们判断它出现过就错了,答案很简单,因为虽然1,3,8这个hash组合之前没有出现过,但是对应的位置都在其他元素中出现过了,这样就出现误差了。所以我们可以知道,布隆过滤器对于不存在的判断一定是准确的,但是对于存在的判断是有可能有错误的

PYTHON代码

# 插入元素
def bloom_filter(filter, value, hash_functions):
    m = len(filter)
    for func in hash_functions:
        idx = func(value) % m
        filter[idx] = True
    return filter
    
# 判断元素
def is_member_in_filter(filter, value, hash_functions):
    m = len(filter)
    for func in hash_functions:
       idx = func(value) % m
        if not filter[idx]:
            return False
    return True

redis使用布隆过滤器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值