`

从哈希存储到Bloom Filter

    博客分类:
  • Java
 
阅读更多

 

先解释一下什么是哈希函数。哈希函数简单来说就是一种映射,它可取值的范围(定义域)通常很大,但值域相对较小。哈希函数所作的工作就是将一个很大定义域内的值映射到一个相对较小的值域内。

传统的哈希存储

 

假设要哈希的集合为S,它有n个元素。传统的哈希方法是,将哈希区域组织成hh > n)个格子的列表,每一个格子都能存储S中的一个元素。存储时将S中的每一个元素映射到{0, 1, … , h-1}的范围内,然后以这个值为索引将此元素存储到对应的格子内。由于哈希函数将一个大集合映射到一个小集合中,所以存在将大集合中的多个元素映射到同一位置的情况,这就是所谓的碰撞(Collision)。当碰撞发生时,有多种策略可供选择,比如用链表将映射到同一位置的元素串起来,或者在碰撞发生时再进行哈希映射直到找到空位为止等等。

 

 

传统的哈希方法不会发生错误,而且存储的元素还可以复原。如果哈希函数选择得当,碰撞出现的情况比较少,那么查找某一个元素也很快。但是,如果你哈希某个集合只是为了判断某个元素是否在这个集合中,那么你会发现好像存储整个集合有点浪费。按传统的哈希方法判断某个元素是否属于集合时,会把这个元素和它映射位置上的元素进行匹配,如果完全匹配则说明属于集合,如果不匹配则不属于。在绝大部分查找都不能匹配的情况下(这常常是实际中的情况),我们会发现匹配的过程经常用不到整个元素,因为元素的一部分就可以判断不匹配了。基于“部分信息就能判断不匹配”这个思路,Burton BloomBloom Filter的发明者)提出了一种改进的方法。

改进的哈希存储

 

在这种改进的方法中,哈希区域和前面一样仍然被组织成格子的列表。但这次并不直接将集合元素存在格子里,而是将每一个元素编码然后将编码存在格子里。假设每个集合元素要占b位,编码后要占cc < b)位。由于编码位数少于元素位数,不同元素的编码有可能相同,因此在查找元素时可能会出现错误。编码位数取决于你期望的错误率:编码位数越多,错误就越少,反之则越大;当错误少到一定程度(大约2-b),编码位数就足以存下整个元素,因此就变回了传统的哈希存储。

 

 

这种方法对传统的哈希存储进行了改良,允许用户在错误率和存储空间之间作权衡。这里我们已经能够看到Bloom Filter的一点端倪。如果说这种方法已经孕育了“正确率换空间”的思想的话,那么Bloom Filter更是这个思想的大胆实践,它完全摆脱了传统的哈希存储方法,在存储空间使用和减少错误率方面又进了一步。

Bloom Filter

 

Bloom Filter中,哈希区域的每一位都被当成是独立的可寻址的单元。在对集合元素进行编码时,同时使用若干个独立的哈希函数,将每一个哈希函数映射的地址都置为1。这种编码方法可谓是另辟蹊径,摆脱了原来一个格子一个格子的存储方法。在改进的哈希存储中,编码位数是和正确率交换的筹码,而在Bloom Filter中,筹码变成了哈希函数的个数以及整个哈希区域(即位数组)的大小。如果想具体知道合适的哈希函数个数和位数组大小,请参阅第一篇Bloom Filter概念和原理

 

和前面两种哈希存储方法相比,Bloom Filter最大的优势自然是它的空间效率。另外,由于Bloom Filter不用处理碰撞(Collision),因此它在增加或查找集合元素时所用的时间完全恒定(哈希函数的计算时间),无论集合元素本身有多大,也无论多少集合元素已经加入到了位数组中。由于Bloom Filter和改进的哈希存储都对集合元素进行了编码,因此想要从哈希区域中恢复集合元素并不容易。但同时,如果你不想让别人直接看到集合元素,这样的编码处理倒可以看成是一种加密,有效保护了你的隐私。

 

Bloom Filter很大的一个缺点就是不能删除元素。由于Bloom Filter不处理碰撞,有可能多个哈希函数都映射到了同一位,因此不能简单地在删除时将1置为0。后面我们会看到,Counting Bloom Filter通过将每一位扩展为一个Counter来解决这一问题。

参考资

 

[1] B. Bloom. Space/Time Tradeoffs in Hash Coding with Allowable Errors. Communications of the ACM 13:7 (1970), 422—426.

[2] http://www.cs.berkeley.edu/~pbg/cs270/notes/lec27.pdf

[3] http://security.riit.tsinghua.edu.cn/seminar/2006_11_16/hash_function_yaxuan.ppt

分享到:
评论

相关推荐

    论文研究-基于Bloomfilter的RFID中间件数据过滤算法研究.pdf

    有效地减少RFID系统中冗余阅读器或天线采集到...经实验可见,标准Bloom filter与哈希过滤(hash filter)相比具有明显的优势,对其改进后,采用二维并行Bloom filter在误判率、吞吐率和存储空间上具有更高的系统性能。

    论文研究-利用Bloomfilter实现长流识别.pdf

    给出了利用Bloom filter识别长流的算法。提出了使用分层哈希的方法,减少了在哈希过程中的冲突。采用带有部分主机信息的哈希函数,利用哈希串的重叠和数量上的一致性,使在识别长流的过程中能够很方便地还原出主机的...

    bloomfilter:用Golang编写的Bloomfilter,包括旋转和RPC

    该存储库包含多个Bloomfilter实现,可用于解决不同的分布式计算问题。 该解决方案从优化的本地实现开始,该实现增加了轮换,RPC协调和通用拒绝器。 这些软件包是: bitset :基本集的位集的实现

    bloomfilter-rs:用Rust制造的Bloom Bloom过滤器

    上次使用Rust 1.1.0测试例子对于具有100个存储桶和5个哈希函数的Bloom过滤器: let mut bf = BloomFilter :: new ( 100 , 5 );bf. insert ( & "hamster" );bf. insert ( & "coffee" );bf. check ( & "hamster" );//...

    bloom-filter:数据结构Bloom-Filter的python实现

    BIN-702的Bloom过滤器实现 入门 TODO 先决条件 运行基准 TODO 基准结果 放 兆字节 峰值mb 插入毫秒 清除毫秒 找到ms 1000 0.000296 0.041276 0.9889 0 0 10000 0.000296 0.655676 1.9998 0 0 100000 ...

    aioredis_bloom:aioredis 布隆过滤器

    from aioredis_bloom import BloomFilter loop = asyncio . get_event_loop () @ asyncio . coroutine def go (): redis = yield from aioredis . create_redis ( ( 'localhost' , 6379 ), loop = loop ) ...

    BloomFilter:创建此存储库的目的是显示使用给定元素集或连续数据字符串进行成员资格测试的Bloom筛选器的实现

    BloomFilter 术语 概率数据结构 “否”是“否”,但是“是”可能不是“是”。 概率数据结构是一组数据结构,对于大数据和流应用程序非常有用。 这些数据结构使用哈希函数随机化并紧凑地表示一组项目 基数 术语“基数...

    blizzard_hash_for_android:降低暴雪哈希的内存消耗(理论上牺牲碰撞率),千万量级别以内的数据,碰撞率和内存消耗都优与bloom filter

    blizzard_hash_for_android降低暴雪哈希的内存消耗(理论上牺牲碰撞率),千万量级别以内的数据,碰撞率和内存消耗都优与bloom filternode 结点存放两个属性:1)nHashA, nHashA取byte的前7位(1~127),用以存储Hash...

    minperf:最小的完美哈希函数库

    通过存储每个密钥的哈希指纹,可以用作静态bloom筛选器。 性能与 CHD和GOV算法非常相似,但可配置,并且可以使用更少的空间。 该库应该已经可用,但是仍在进行中。 该计划是发表论文。 使用的算法被描述 ,并且被...

    哈希表:用于Node.js的快速,可靠的布谷鸟哈希表

    将二进制密钥编码为十六进制或Base64字符串很慢,并且Javascript字符串具有额外的存储开销。 极高的GC暂停时间。 每当GC需要标记对象中的每个指针时,香草对象中的数百万个指针就可以每隔几秒钟阻塞一次Node.js事件...

    RFID数据流近似去重

    为了表达S={x1, x2,…,xn}这样一个n个元素的集合,Bloom Filter使用k个相互独立的哈希函数(Hash Function),它们分别将集合中的每个元素映射到{1,…,m}的范围中。对任意一个元素x,第i个哈希函数映射的位置hi(x)就...

    libnindex:N-Index是常见的数据存储和索引库

    BloomFilter 块表 多块表 RB树 堆 KD树 三元搜索树 例子 HashTable / TimerHashTable struct MyKey { uint64_t ddwUserId; uint32_t dwSubId; }; struct MyValue { char sName [ 16 ]; } __attribute__...

    C++网络爬虫项目

    2.2.2. 布隆过滤器(BloomFilter) 基于布隆算法,对欲加入队列的原始统一资源定位符进行过滤,以防止已被抓 取过的URL再次入队,降低冗余开销同时避免无限循环。 2.2.3. 原始统一资源定位符(RawUrl) 提供原始形态的...

    论文研究-P2P网络搜索技术的研究.pdf

    分布式存储系统以其分布式控制、自组织性和普遍的适应性而受到越来越多的关注。搜索是所有存储系统的重要组成部分,而对终端用户的反应时间是衡量一个搜索引擎优良的重要指标。讨论了目前几种流行的P2P网络搜索技术...

    以太坊的数据结构(状态树、交易树、收据树)及代码分析

    文章目录一、状态树1.1 trie1.2 Patricia tree(trie)1.3 Merkle Patricia tree(trie)1.4 Modified Merkle Patricia tree(trie)1.5 账户状态值存储二、交易树、收据树2.1 概述2.2 Modified Merkle Patricia tree(trie...

    xorf:Xor过滤器-高效的概率哈希集。 比布卢姆和布谷鸟过滤器更快,更小

    该存储库托管一个Rust库,该库实现了-数据结构,可使用较少的内存快速逼近集成员身份。 诸如xor过滤器之类的概率过滤器在有时可能出现误报的情况下很有用,但重要的是要节省空间和时间。 换句话说,与通用哈希集相比...

    fastfilter_java:快速近似会员资格过滤器(Java)

    使用布谷鸟哈希来存储指纹 布谷鸟过滤器:8和16位变体,比常规布谷鸟过滤器需要的空间少 哥伦布压缩集(GCS):比布谷鸟过滤器需要的空间更少,但查找速度很慢 最小的完美哈希过滤器:比杜鹃过滤器需要更少的空间,...

    具有错误检测和纠正功能的基于Bloom过滤器的数据管理-研究论文

    一个未婚的场合摘要会影响硬件实施的布隆过滤器的哈希技术逻辑,可能会产生错误,包括假阴性。 现有机器的主要缺点是计数布隆过滤器和压缩布隆过滤器。 为了克服比较器的方法。 比较输入数据和存储统计信息。

    数据结构与算法.xmind

    BloomFilter 布隆过滤器 线性表 栈 先进后出(LIFO, Last In First Out) 实现 用两个指针域分别指向栈顶和栈底 常见操作 进栈 栈顶本来指向的节点交由新节点来指向 栈顶指针指向新...

    Python+Redis实现布隆过滤器

     布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多...

Global site tag (gtag.js) - Google Analytics