Cuckoo Hash
最近在看APSI中,涉及到了一些hash技术(朴素hash,置换hash,布谷鸟hash),Hash 技术是 PSI 协议中优化通信复杂度和计算杂度的重要工具之一,现在系统的认识一下!
更多关于哈希函数的参考:哈希函数
朴素hash(plain hash)#
使用
比如:
该表中有四个桶,每个桶中最多可以存4个值。
置换hash(permutation-based hash)#
将元素转化为更短的字符串并存储在 Hash 表中, 以此减少存储空间和计算复杂度.
元素插入如下: 元素
最后桶中存储大小为
布谷鸟hash(cuckoo hash)#
思考一个问题:为什么要用布谷鸟哈希?
1、首先是能隐藏数据
2、是一个高性能的哈希方案
3、哈希的本质是从一个较大空间映射到一个较小的空间,因此在插入数据足够多之后,根据鸽巢原理,一定会存在位置冲突。常见的哈希表(Hash Table 或者字典,dictionary)会通过链表、开放地址探测等方式来处理冲突。单桶多函数的布谷鸟哈希,便是开放地址法处理冲突的一种哈希表,只不过有冲突后,不是通过线性寻找新的位置,而是通过额外哈希函数来寻找。
背景#
Cuckoo中文名叫布谷鸟,这种鸟有一种即狡猾又贪婪的习性,它不肯自己筑巢, 而是把蛋下到别的鸟巢里,而且它的幼鸟又会比别的鸟早出生,布谷幼鸟天生有一种残忍的动作,幼鸟会拼命把未出生的其它鸟蛋挤出窝巢,今后以便独享“养父 母”的食物。借助生物学上这一典故,cuckoo hashing处理碰撞的方法,就是把原来占用位置的这个元素踢走,不过被踢出去的元素还要比鸟蛋幸运,因为它还有一个备用位置可以安置,如果备用位置上 还有人,再把它踢走,如此往复。直到被踢的次数达到一个上限,才确认哈希表已满,并执行rehash操作。
定义#
布谷鸟哈希最早是 Rasmus Pagh 和 Flemming Friche Rodler 在 2001 年一次会议上公开的 。
思想#
使用
- 计算
, 如果 至少有 1 个桶为空, 则随机插入;如果都不为空, 则随机选择 , 替换桶中的元素 , 再对被替换元素 执行上述操作.
当上述替换操作达到一定阈值时, 则将
变种#
布谷鸟哈希可以有很多变种
使用两个哈希函数和一个哈希桶(表只有一个桶)#
- 对key值hash,生成两个hash key值,hashk1和 hashk2, 如果对应的两个位置上有一个为空,那么直接把key插入即可。
- 否则,任选一个位置,把key值插入,把已经在那个位置的key值踢出来。
- 被踢出来的key值,需要选择另外一个hash函数插入,直到没有key被踢出为止。
下面是第一种情况,有空位置,直接插入即可!
下面是出现碰撞的情况,需要被踢出,选择另外一个hash函数重新插入
举例#
可以看作两张表,但序号是一致的。
应用#
cmu 大学的 Bin Fan 等人,在 2014 年发表了一篇名为:Cuckoo Filter: Practically Better Than Bloom的论文,基本思想是将布谷鸟哈希(cuckoo hash)的思想应用于集合(set membership)方向,可以替代工程中常用的 Bloom Filter(布隆过滤器),有以下优势:
1、支持删除元素
2、更高的查询效率,尤其在高负载因子时
3、相比其他支持删除的 Filter 更容易实现
4、如果期望误报率在 3% 以下,所用空间比 Bloom Filter 少
为了达到以上效果,Cuckoo Filter 对原 Cuckoo Hash 做了如下改变:
1、为了提高桶的利用率,使用多路哈希桶。
2、为了减少内存的使用,只存储 key 指纹(不懂就问,什么是key指纹?)。
实现#
微软有一个开源库:Kuku,下面说一下怎么用。
介绍#
Kuku是一个简单的开源(MIT许可)布谷鸟哈希库,由微软的加密和隐私研究小组开发。KuCu是用现代标准C++编写的,没有外部依赖关系,便于在许多不同的环境中编译和运行。
cuckoo hash#
布谷鸟哈希是一种哈希技术,可以实现非常高的填充率,尤其能创建高效的哈希表,每个桶(bin)中只有一个项目。这是通过使用多个(通常是2、3或4个)不同的哈希函数实现的,如下所示:
(1)
(2)当
(3)如果尝试多次后失败,则将item放入预准备好的最大容量的桶(stash)中,然后返回
(4)如果stash已经达到装满,将该item储存在"已知位置"并返回
不太理解这个已知位置;stash可以看作是另外一张hash表
为了判断一个item:
kuku#
Kuku是一个简约的库,它支持布谷鸟哈希的某些变体,如上所述。它使用Tabulation hashing作为hash函数。Kuku中的item的长度正好是128位,不能增加;然而较长的item总是可以使用其他一些接受任意输入长度的哈希函数哈希到128位,并且输出可以随后在Kuku中使用。
Tabulation hashing:一种特殊的hash函数
安装#
//下载库
git clone https://github.com/Microsoft/Kuku
//编译,这样生成的静态文件/build/lib/libkuku-2.1.a,但没有编译example和test下文件
cd kuku-main
cmake -S . -B build
cmake --build build
//编译(exapme和test)
cmake -S . -B build -DKUKU_BUILD_EXAMPLES=ON
cmake -S . -B build -DKUKU_BUILD_TESTS=ON
cmake --build build
使用#
example实例#
主要模块#
主要是src/kuku下的文件
(1)locfunc
(2)kuku
(3)common
参考#
1、Cuckoo Hash 布谷鸟哈希
2、布谷鸟哈希和布谷鸟过滤器
3、CUCKOO FILTER:设计与实现
4、面向隐私保护的集合交集计算综述
5、Scalable private set intersection based on OT extension
作者:Hang Shao
出处:https://www.cnblogs.com/pam-sh/p/16047585.html
版权:本作品采用「知识共享」许可协议进行许可。
声明:欢迎交流! 原文链接 ,如有问题,可邮件(mir_soh@163.com)咨询.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)