我有以下“单词”,我需要一个哈希函数。
单词 w 的格式为 w =字符[字符]数字[数字] 括号 [] 表示这些是可选的。字符是 A,B ... Z ,数字是 0,1,2 ......
所以有26 * 26 * 10 * 10 = 67600个可能的单词,我需要一个包含220个条目的表的哈希函数。分割方法显然可以在这里工作,但我正在寻找可以更容易计算的东西
非常感谢任何帮助
答案 0 :(得分:1)
您可以将数字系统中的单词视为基数为36的整数。请参阅Wiki
但是有一个边缘情况,因为你有可选字符,所以你需要以某种方式忽略它们。您可以添加empty character
(示例:#),在转化过程中您会忽略它。
PS。它是基数为37的数值系统,但逻辑保持不变。
答案 1 :(得分:1)
有超过67,600个可能的单词。你有:
所以可能的单词总数是260 + 6760 + 2600 + 67600 = 77,220
哪个可以被220整除。所以你的"哈希函数"可以是一个简单的模数:
bucket = index % 220
我不认为你会发现比模数更容易计算的东西。您可以使用标准字符串哈希码函数,但这将涉及多个移位和添加,然后可能是最后的模数。您可以使用一个简单的校验和,这只是一些补充,但是这不太可能在哈希表中为您提供良好的项目分布。由于可能的项目总数是桶数的偶数倍,因此在速度或分布方面很难超过模数。
顺便说一句,@ Thilo的评论是正确的:你的总可能性是26 * 27 * 10 * 11。如你所说,第二个字符和第二个数字是可选的。如果将可选属性视为另一个可能的字符(空字符),则第二个字符的字母表包含27个项目(26个字母字符和空字符)。所以像" A99"实际上是这样的形式:
字符 空字符 数字 数字