HashFunction表示“单词”

时间:2017-06-20 13:24:48

标签: algorithm

我有以下“单词”,我需要一个哈希函数。

单词 w 的格式为 w =字符[字符]数字[数字] 括号 [] 表示这些是可选的。字符是 A,B ... Z ,数字是 0,1,2 ......

所以有26 * 26 * 10 * 10 = 67600个可能的单词,我需要一个包含220个条目的表的哈希函数。分割方法显然可以在这里工作,但我正在寻找可以更容易计算的东西

非常感谢任何帮助

2 个答案:

答案 0 :(得分:1)

您可以将数字系统中的单词视为基数为36的整数。请参阅Wiki

但是有一个边缘情况,因为你有可选字符,所以你需要以某种方式忽略它们。您可以添加empty character(示例:#),在转化过程中您会忽略它。

PS。它是基数为37的数值系统,但逻辑保持不变。

答案 1 :(得分:1)

有超过67,600个可能的单词。你有:

  • 字符 - 数字(A9,Q3等):26 * 10(260)可能
  • 字符 - 字符 - 数字(AA3,BQ5等):26 * 26 * 10(6,760)可能
  • 字符 - 数字 - 数字(A95,G47等):26 * 10 * 10(2,600)可能
  • 字符 - 字符 - 数字 - 数字:26 * 26 * 10 * 10(67,600)可能

所以可能的单词总数是260 + 6760 + 2600 + 67600 = 77,220

哪个可以被220整除。所以你的"哈希函数"可以是一个简单的模数:

bucket = index % 220

我不认为你会发现比模数更容易计算的东西。您可以使用标准字符串哈希码函数,但这将涉及多个移位和添加,然后可能是最后的模数。您可以使用一个简单的校验和,这只是一些补充,但是这不太可能在哈希表中为您提供良好的项目分布。由于可能的项目总数是桶数的偶数倍,因此在速度或分布方面很难超过模数。

顺便说一句,@ Thilo的评论是正确的:你的总可能性是26 * 27 * 10 * 11。如你所说,第二个字符和第二个数字是可选的。如果将可选属性视为另一个可能的字符(空字符),则第二个字符的字母表包含27个项目(26个字母字符和空字符)。所以像" A99"实际上是这样的形式:

字符 空字符 数字 数字