最近在看APSI中,涉及到了一些hash技术(朴素hash,置换hash,布谷鸟hash),Hash 技术是 PSI 协议中优化通信复杂度和计算杂度的重要工具之一,现在系统的认识一下!

更多关于哈希函数的参考:哈希函数

朴素hash(plain hash)

使用\(ℎℎ_(·)\)将元素映射到具有 b 个桶的 Hash 表 T 中的 \(k\)个位置, 每个桶最多有\(lb(n)\)个元素(\(n\)为集合的元素个数),其中\(ℎℎ_(·)\)表示\(k\)个不同的Hash 函数 \(h_1(·), h_2(·),...,h_k(·)\).

比如:

该表中有四个桶,每个桶中最多可以存4个值。

置换hash(permutation-based hash)

将元素转化为更短的字符串并存储在 Hash 表中, 以此减少存储空间和计算复杂度.

元素插入如下: 元素 \(x\) 表示为bit 的形式并拆分为 2 部分 \(x_1, x_2\). 为元素获取 Hash表的索引: \(_1 ⊕ (_2)\), \(H\) 为 Hash 函数.

最后桶中存储大小为\(|_2| = || − |_1|\),其中\(|x|\)表示 \(x\) 的比特长度;\(⊕\)表示按位异或.

布谷鸟hash(cuckoo hash)

思考一个问题:为什么要用布谷鸟哈希?

1、首先是能隐藏数据

2、是一个高性能的哈希方案

3、哈希的本质是从一个较大空间映射到一个较小的空间,因此在插入数据足够多之后,根据鸽巢原理,一定会存在位置冲突。常见的哈希表(Hash Table 或者字典,dictionary)会通过链表、开放地址探测等方式来处理冲突。单桶多函数的布谷鸟哈希,便是开放地址法处理冲突的一种哈希表,只不过有冲突后,不是通过线性寻找新的位置,而是通过额外哈希函数来寻找。

背景

Cuckoo中文名叫布谷鸟,这种鸟有一种即狡猾又贪婪的习性,它不肯自己筑巢, 而是把蛋下到别的鸟巢里,而且它的幼鸟又会比别的鸟早出生,布谷幼鸟天生有一种残忍的动作,幼鸟会拼命把未出生的其它鸟蛋挤出窝巢,今后以便独享“养父 母”的食物。借助生物学上这一典故,cuckoo hashing处理碰撞的方法,就是把原来占用位置的这个元素踢走,不过被踢出去的元素还要比鸟蛋幸运,因为它还有一个备用位置可以安置,如果备用位置上 还有人,再把它踢走,如此往复。直到被踢的次数达到一个上限,才确认哈希表已满,并执行rehash操作。

定义

布谷鸟哈希最早是 Rasmus Pagh 和 Flemming Friche Rodler 在 2001 年一次会议上公开的 。

思想

使用\(ℎℎ_(·)\)将元素 \(e\) 映射到具有 \(b\) 个桶的 Hash 表 T 中的某一个位置, 确保每个桶只能有 1 个元素:

  • 计算 \(h_1(e), h_2(e), ..., h_k(e)\), 如果 \(T[h_1(e)], T[h_2(e)], …, T[h_k(e)]\)至少有 1 个桶为空, 则随机插入;如果都不为空, 则随机选择\(T[h_i(e)]\), 替换桶中的元素 \(T[h_i(e’)]\), 再对被替换元素\(e’\)执行上述操作.

当上述替换操作达到一定阈值时, 则将 \(e’\)放置在额外的存储空间 stash 中. 因此, 元素 \(e\)必定在以下容器中找到: \(T[h_1(e)], T[h_2(e)], …, T[h_k(e)]\)或 \(stash\). 由于 \(stash\) 可能会存在溢出威胁而导致Hash 错误, Pinkas 等人[5]通过实验分析出 Hash 函数个数、\(stash\) 大小和桶数 \(b\) 的最佳关系.

变种

布谷鸟哈希可以有很多变种

使用两个哈希函数和一个哈希桶(表只有一个桶)

  1. 对key值hash,生成两个hash key值,hashk1和 hashk2, 如果对应的两个位置上有一个为空,那么直接把key插入即可。
  2. 否则,任选一个位置,把key值插入,把已经在那个位置的key值踢出来。
  3. 被踢出来的key值,需要选择另外一个hash函数插入,直到没有key被踢出为止。

下面是第一种情况,有空位置,直接插入即可!

下面是出现碰撞的情况,需要被踢出,选择另外一个hash函数重新插入

举例

假设有两个hash函数:



下面依次插入item:

可以看作两张表,但序号是一致的。

当再次插入item:6时,就出现了问题,插入失败:

应用

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)\(H_1, H_2, ..., H_k\)表示hash函数

(2)当\(X\)要插入时,任意选择一个hash函数\(H_j\),判断对应的bin是否为空(\(H_j(X)\)所对应的位置),如果为空,则插入\(X\),返回\(True\);否则,移除bin中存在的值\(Y\),将\(X\)插入到该位置,\(Y\)则重新执行插入操作(选用其他的hash函数)

(3)如果尝试多次后失败,则将item放入预准备好的最大容量的桶(stash)中,然后返回\(True\)

(4)如果stash已经达到装满,将该item储存在"已知位置"并返回\(False\)

不太理解这个已知位置;stash可以看作是另外一张hash表

为了判断一个item:\(Z\)是否在hash表中,需要逐个比较\(H_1(Z), H_2(Z), ..., H_k(Z)\),stash同样也是。如果不需要使用stash,则使长度为0即可。

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

最后结果在/build/bin下:

使用

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

Cuckoo Hash的更多相关文章

  1. Cuckoo hash算法分析

    一 基本思想: cuckoo hash是一种解决hash冲突的方法,其目的是使用简单的hash 函数来提高hash table的利用率,同时保证O(1)的查询时间 基本思想是使用2个hash函数来处理 ...

  2. Cuckoo Hash和多级Hash的粗浅认识

    通过对Cuckoo Hash.多级Hash和BloomFilter的粗浅了解,感觉它们三者存在类似之处,算是近亲(暂且把普通的Hash称作远亲). Cuckoo Hash的思想非常简单,冲突时,重Ha ...

  3. Cuckoo Hash——Hash冲突的解决办法

    参考文献: 1.Cuckoo Filter hash算法 2.cuckoo hash 用途: Cuckoo Hash(布谷鸟散列).问了解决哈希冲突的问题而提出,利用较少的计算换取较大的空间.占用空间 ...

  4. Cuckoo hash算法分析——其根本思想和bloom filter一致 增加hash函数来解决碰撞 节省了空间但代价是查找次数增加

    基本思想: cuckoo hash是一种解决hash冲突的方法,其目的是使用简单的hash 函数来提高hash table的利用率,同时保证O(1)的查询时间 基本思想是使用2个hash函数来处理碰撞 ...

  5. 过滤器系列(二)—— Cuckoo filter

    这一篇讲的是布谷过滤器(cuckoo fliter),这个名字来源于更早发表的布谷散列(cuckoo hash),尽管我也不知道为什么当初要给这种散列表起个鸟名=_= 由于布谷过滤器本身的思想就源自于 ...

  6. DPDK L3fwd 源码阅读

    代码部分 整个L3fwd有三千多行代码,但总体思想就是在L2fwd的基础上,增加网络层的根据 IP 地址进行路由查找的内容. main.c 文件 int main(int argc, char **a ...

  7. 阅读 CloudDPI:Cloud+DPI+Reversible Sketch

    CloudDPI: Cloud-Based Privacy-Preserving Deep Packet Inspection via Reversible Sketch 与sketch的结合点:将修 ...

  8. [GitHub] 75+的 C# 数据结构和算法实现

    C#中标准数据结构和算法的即插即用类库项目 GitHub:https://github.com/aalhour/C-Sharp-Algorithms Watch: 307 Star: 3.4k For ...

  9. Cuckoo for Hashing(hash)hunnuoj

    Problem B:Cuckoo for HashingAn integer hash table is a data structure that supports insert, delete a ...

  10. BloomFilter 与 Cuckoo Filter

    BloomFilter 与 CuckooFilter Bloom Filter 原理 Bloom Filter是一种空间效率很高的随机数据结构,它的原理是,当一个元素被加入集合时,通过K个相互独立的H ...

随机推荐

  1. 压缩工具之upx

    在golang项目中, 最终运行的是打包好的二进制文件,如何才能让这个文件尽可能的小呢? 1.编译阶段的参数处理 go build使用的是静态编译,会将程序的依赖一起打包,这样一来编译得到的可执行文件 ...

  2. golang之基础语法

    Go 是一种强类型语言. 这意味着你声明的每个变量都绑定到特定的数据类型,并且只接受与此类型匹配的值. Go 有四类数据类型: 基本类型:数字.字符串和布尔值 聚合类型:数组和结构 引用类型:指针.切 ...

  3. Ubuntu下xrdp登陆故障解决方案

    故障描述: Ubuntu使用xrdp远程桌面运行一段时间后,出现登陆错误: xrdp_mm_process_login_response: login failed 原因分析: 远程桌面没有正确关闭所 ...

  4. 使用阿里的ARTHAS跟踪方法耗时

    使用命令跟踪一个方法的耗时 在arthas 命令行下输入命令 trace 类全路径 监控的方法 trace com.redxun.bpm.core.service.BpmInstServiceImpl ...

  5. vue中this.$nextTick()

    this.$nextTick()是在下一次DOM更新后执行其指定回调函数 this.$nextTick(回调函数) 使用场景:在改变数据后,要对更新后的DOM进行操作时使用

  6. 埃尼阿克ENIAC与计算机发展,及信息技术发展史

    一.埃尼阿克ENIAC 第二次世界大战期间,国军方为了研发新型的大炮和导弹,设立了"弹道研究实验室".实验室为了计算炮弹弹道,用了200多人加班加点进行计算,速度依感无法达到军方要 ...

  7. 如何使用对象存储 COS ?七个步骤,帮你搞定!

    导语:本文将介绍新手如何使用对象存储 COS,主要面向小白用户,旨在快速带领用户了解 COS 的优势.功能.费用.接口及控制台指南. 01 什么是对象存储 腾讯云对象存储 COS(Cloud Obje ...

  8. Netty SSL双向验证

    一· 快速命令 1.生成ca证书 openssl req -new -x509 -keyout ca.key -out ca.crt -days 36500在本目录得到 ca.key 和 ca.crt ...

  9. 【Docker】安装镜像报错warning: /var/cache/yum/x86_64/7/extras/packages/epel-release-7-11.noarch.rpm: Header

    这个的解决方法就是加上这个就可以了

  10. Qt编写的项目作品14-智能安防集中管理平台

    一.功能特点 同时集成了楼宇对讲.住户报警.门禁控制.公共报警.视频监控等模块. 系统管理部分包括系统配置.对讲配置.住户配置.公共配置.监控配置.地图管理.视频联动.用户管理.区域管理. 图形化的实 ...