在 Lecture 8 中我们提到过,解决 collision 的方法有两种:
本节介绍的就是第二种。发生 collision 时,open addressing 会按照某种固定的方式寻找 table 中的下一个 slot,每个 slot 只存放一个 key/item,因此
NOTE: 这里把 open addressing 和原始 hash function 合起来当作一个 hash function 实际上增加了学生的理解负担。open addressing 与 chaining 一样,是解决 collision 的策略,这种策略适用于任意 hash function。将 collision resolution strategy 和 hash function 看作是可以组合的两个部件更容易理解。不过本文将遵守原课程教授的方式。
Insert key/item 时,不断 probe 直到找到空 slot 为止:
1 | for i in range(m): |
举例如下:
根据给定的某个 probe strategy,4, 6, 1, 5...
,在 slot 5 之前都发生 collision,因此 496 最终被插入到 slot 5 中。
Search key/item 时,按照相同的顺序 probe,直到找到空 slot 或者目标 key 为止:
1 | for i in range(m): |
Delete key 时,如果直接从 slot 中移除元素会导致后续的 search 无法找到正确的结果。回到 1.1.1 insert 一节中的例子,如果我们将 search(496)
将失效。合理的做法是利用某个特殊标记,如 "DeleteMe",insert 认为它是空 slot,而 search 不认为。
顾名思义,linear probing 就是从初始位置开始往后顺序遍历,假设
可以证明,当
利用 2 个 hash function,
如果
假设使用 open addressing 策略往大小为
证明如下:假设我们想要继续往 table 中插入
每次 probe 的成功率都至少为
由于 clustering 现象的存在且实现中没有指针寻址,open addressing 对缓存更友好,但同样由于 clustering 现象的存在,open addresing 对 hash functions 的选择比较敏感,且其
cryptographic hash function 可以将任意长度的数据稳定地 (deterministic) 转化成固定大小的 hash value,即 bit string,意外或恶意修改数据会造成 hash value 的大幅度变化。通常称待加密的数据为 message,加密后的 hash value 为 (message) digest。
假设 d 是 hash value 的 bit 数量,通常安全性较高的
One-Way (OW) (pre-image resistance): 通过 digest 找到一条 message 计算上不可行。即给定
Collision-resistance (CR):找到存在 collision 的两条 message 计算上不可行。即找到
Target collision-resistance (TCR) (2nd pre-image resistance):给定条 message,找到另一条与它冲突的 message' 计算上不可行。即给定
CR 是 TCR 的充分非必要条件,而 OW 与 CR/TCR 之间没有直接关系。
cryptographic hash function 的核心是一个特殊的函数,其输入是 2 个固定大小的数据块,输出是对应的 hash value,如下图所示:
数据块的大小取决于算法本身,通常在 128 bits 到 512 bits 之间。上述函数是整个 cryptographic hash function 的最小计算单元,完整的加密过程是将原始待加密数据切分成固定大小,然后执行多轮次的上述计算,将前一次的结果与下一个数据块共同作为下一轮计算的输入,如下图所示:
我们称这个过程为 avalanche effect of hashing (哈希雪崩效应),即前面的数据块会不断影响后续的所有轮次加密结果。avalanche effect 使得一旦两条消息存在一点不同 (single bit),digest 就会显著不同。
综上所述,cryptographic hash function 需要决定如何切分 message,如何将前一次处理的结果输入到后一次计算中,在这两个设计点上的不同决定影响着函数的功能。