因此,当引入哈希表或哈希函数是John Smith和其他人的电话簿示例时,这是一个非常流行的示例。
我的问题是为什么John Smith和Sandra Dee之间会发生碰撞?
看一下这个例子
http://commons.wikimedia.org/wiki/File:Hash_table_5_0_1_1_1_1_0_SP.svg
我在想(521 + 1234)mod256将是152,这是关闭的(它是219)。我知道这是为了证明一个碰撞,但为什么首先有一个呢?哈希函数中的公式是什么?
编辑:还有另一个例子,他们都映射到2而不是。
http://en.wikipedia.org/wiki/Hash_function#mediaviewer/File:Hash_table_4_1_1_0_0_1_0_LL.svg
答案 0 :(得分:1)
这些例子中没有哈希函数,它们只是人为的例子。哈希是完全弥补的。
生成first example的源代码是here。
如果您查看choose_keys_and_hashes
内部,您会看到以下行:
tb.key_hsh = [ 152, 001, 254, 154, 153 ]
因此哈希只存储在一个数组中。接下来是行:
if op.collisions :
# Make "Sandra Dee" collide with "John Smith":
tb.key_hsh[3] = tb.key_hsh[0]
所以“碰撞”完全是假的。第二个示例似乎是使用nkeys = 4的相同脚本生成的。
伪造它比查找输入和提供散列函数更容易,它提供了所需的输出。