这个英文单词列表有什么好的哈希函数?

时间:2017-05-16 05:16:01

标签: c++ hashtable

目前,我使用 80 的表格,因为我在文件中有约73个字。 我目前的散列方法非常基础和通用。在我将它们全部小写后,我将字母的 ASCII 值相加,然后我通过tablesize mod(%) 80当前) 。我遇到了很多冲突,还有很多未使用的桶/索引。既然我确切地知道我需要散列哪些单词以及有多少单词,是否有更好的方法可用,以尽可能少的冲突?我的目标是获得6分或更低。

另外,附带问题。一旦单词在哈希表中,如果我想查找某个单词,但是输入错误的单词,或者加扰,我怎么能在哈希表中找到它?

例如,如果我在哈希表中有“ apple ”,并且对于我的搜索,我使用“ leppa ”,这是苹果拼写向后,有什么好处以这种方式解读“leppa”的方式,苹果会出来吗?

如果你不确定我刚问的话,请问我,如果我不清楚的话,对不起!

2 个答案:

答案 0 :(得分:3)

尝试md5,你的词典中没有碰撞。

您可以简单地使用std :: hash:

#include <string>
#include <iostream>
#include <functional>

int main()
{
    std::string str = "air conditioner";
    size_t h = std::hash<std::string>()(str);
    std::cout << "hash of \"" << str << "\" is " << h << std::endl;
}

通常它可以实现为fnv1哈希。另一个好的哈希函数是murmur。检查stackexchange上的related question是否有其他常见的哈希函数。

答案 1 :(得分:3)

Murmur哈希被认为是快速的,可能会给出良好的分布 http://en.wikipedia.org/wiki/MurmurHash

为了在哈希中查找“加扰”文本,您需要使用与字母顺序无关的哈希函数 - 非常糟糕的主意,因为所有排列将位于相同的哈希桶中