为什么在这些哈希表示例中John Smith和Sandra之间存在冲突?

时间:2014-10-19 03:22:49

标签: hash hashmap hashtable

因此,当引入哈希表或哈希函数是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

1 个答案:

答案 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的相同脚本生成的。

伪造它比查找输入和提供散列函数更容易,它提供了所需的输出。