在用python实现GBF时遇到的问题

在用python实现GBF时遇到的问题

GBF——即乱码布隆过滤器

GBF的思想与普通的布隆过滤器有一点类似,它同样会用k个哈希函数将一个元素映射到哈希表的k个位置上,但是普通布隆过滤器会将这k个位置置1,而乱码布隆过滤器则是将映射的元素用布尔秘密分享的方式拆成k个秘密份额,并分别放入这k个位置中。
当另一个元素的某个位置已经有元素映射时,这个元素不会改变该位置的值,而是会将这个位置的值作为自己的一个秘密份额,并在其他映射到的位置继续拆分。

用python实现GBF时遇到的问题

目前正在用python对GBF进行实现,这里会记录这个过程中遇到的问题以及解决方法

1、如何生成足够的哈希函数

使用布隆过滤器时,为了能够达到布隆过滤器的最佳性能,需要用到大量的哈希函数。而常用的哈希函数种类有限,例如hashlib模块里实现的哈希函数只有十几个。因此需要生成足够数量的哈希函数。
这里我的思路是:将这些常用的哈希函数进行排列组合,然后从中抽出所需数量的组合,将一个组合看作一个新的哈希函数。
而在一个组合中具体的使用应该有很多不同的方式,例如:将一个哈希函数的输出作为另一个哈希函数的输入,就像人体蜈蚣一样,最后一个哈希函数的输出就是总的输出;或者将这些哈希函数的值转换为整数,直接加起来;或者将所有哈希函数的值转换为字符串,连接在一起后再用指定哈希函数进行哈希等等。

2、 当需要映射的元素数量太大时,布隆过滤器的长度也会很长,并且花费在映射上的时间也会非常多

这可能和python原生列表的效率较低有关,现在正在尝试替换成numpy里的数组。
经尝试,并没有太大提升。

3、将一个列表映射到GBF中,然后检查该列表是否正确映射时,发现映射过程中冲突的元素和检查时发现映射失败的元素不同,或者说检查时发现了一些不是映射过程中发生冲突的元素

出现这种情况的原因在于,将同一个元素映射到乱码布隆过滤器中的k个哈希函数得到的哈希函数发生了冲突。解决方法是用set()对哈希结果进行一个预处理,消除掉重复的哈希值。

4、python定义类时,如果把变量定义在函数体外,也是无法使用的。如果需要定义全局变量,直接定义成self.val就好了

5、求交集时,得到的结果出错

原因是secrets.randbits函数得到的随机值的实际值小于设定值,导致作为模数的n比某些元素的值小,导致取模后出错。解决方案是用secrets.randbits生成的值再乘以16(只是随便选的)。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值