【发布时间】:2011-03-26 03:27:14
【问题描述】:
我有一个包含 n 个字符串(人名)的列表,我想将它们存储在哈希表或类似结构中。我知道 n 的确切值,所以我想使用该事实进行 O(1) 查找,如果我必须使用链表来存储我的哈希节点,这将变得不可能。我的第一反应是使用 djb 哈希,它基本上是这样做的:
for ( i = 0; i < len; i++ )
h = 33 * h + p[i];
要将生成的h 压缩到[0,n] 范围内,我喜欢 简单地执行h%n,但我怀疑这会导致更高的冲突概率这种方式本质上会使我的哈希无用。
那么我的问题是,如何对字符串或生成的哈希值进行哈希处理,以使n 元素在[0,n] 上提供相对均匀的分布?
【问题讨论】:
-
嘿...所以这就是圣杯,嗯?
-
字符串是固定为特定值还是您的意思是任何字符串的
n?如果它们是固定的,那么 caf 的答案可能是最好的(迄今为止)。 -
我有
n的名字,我事先不知道名字,到底有多少要被扔给我。此外,每个名称最多将被访问n-1次......我认为 -
那么完美的哈希是不可能的(因为数据是未知的)。