计算范围为0..n的散列函数

时间:2011-12-07 20:26:41

标签: algorithm hash

我有一个字符串数组。数组的长度为n。如何为每个字符串计算散列键,因此每个键都是0..n?

范围内的数字

更新

数组的项目可能不是字符串,但数字是否有助于我帮助我;)

4 个答案:

答案 0 :(得分:3)

尝试模数N:

int N = array.Length;
int hashMaxN = strings[i].GetHashCode() % N;

这不能保证不同索引的唯一哈希值。但哈希码并不是唯一的。

如果您希望为列表中的每个字符串分配唯一ID,请使用其他答案中的建议:在排序的不同字符串数组中选择字符串索引

int itemHash = myList.Distinct().OrderBy(s => s).IndexOf(item);

无论列表如何排序,它都具有相同字符串的属性在列表中添加字符串将更改项目的哈希码。

答案 1 :(得分:1)

如果不先查看数组的内容,就不能为此选择哈希函数。假设你选择一个哈希函数并让我选择数组。我生成2n个字符串,应用哈希函数,并对结果进行排序。使用2n个字符串并且只有n个可能的值必须存在碰撞,因此我选择包含大量碰撞的n个字符串并将它们返回给您以散列并观察碰撞。

如果您准备提前分析字符串以选择哈希函数的工作,那么一个起点 - 或搜索词的来源 - 将是http://en.wikipedia.org/wiki/Perfect_hash_function中的“最小完美哈希函数”。

您还可以考虑这是否真的是您想要的,以及您是否可以考虑使用不太完美的哈希函数。我喜欢http://en.wikipedia.org/wiki/Cuckoo_hashing的样子,我自己。

答案 2 :(得分:1)

游戏后期,但最近这个话题再次出现nicer solution,而不是我到目前为止所看到的。

取CRC32散列并使用modulo得到所需范围内的数字,例如:

crc32(str) % 5 // returns either 0, 1, 2, 3, 4

答案 3 :(得分:0)

为什么不将数组中的索引用作哈希键?