我必须为函数指针(作为值)创建一个C函数名称(作为键)的查找表。我正在考虑使用STL的hash_map
容器,因为哈希表的访问时间是O(1)
。这有什么好的哈希函数吗?目前我使用(31*H + c)
作为哈希函数。
另外,STL的hash_map
是否会处理冲突,或者我必须在我的代码中处理它们?如果可能,请举一些例子。
示例代码我目前正在处理
#include <iostream>
#include <ext/hash_map>;
using namespace std;
using namespace __gnu_cxx;
namespace __gnu_cxx {
#ifndef __HASH_STRING__
#define __HASH_STRING__
template <>
struct hash<string> {
size_t operator() (const std::string& s) const
{
size_t h = 0;
std::string::const_iterator p, p_end;
for(p = s.begin(), p_end = s.end(); p != p_end; ++p)
{
h = 31 * h + (*p);
}
return h;
}
};
#endif
};
int main()
{
hash_map<string, int> months;
months["january"] = 1;
months["february"] = 2;
months["march"] = 3;
months["april"] = 4;
months["may"] = 5;
months["june"] = 6;
months["july"] = 7;
months["august"] = 8;
months["september"] = 9;
months["october"] = 10;
months["november"] = 11;
months["december"] = 12;
return 0;
}
答案 0 :(得分:0)
您不需要处理碰撞。另外,我认为已经定义了std :: hash,所以你不必担心哈希函数。
答案 1 :(得分:0)
假设你已经拥有完整的STL,它实际上包含一个哈希函数hash<T>
,其包含的形式是suitable for a few different key types,包括char *(C字符串)。我不知道它的性能细节,但STL通常被设计成对大多数应用程序具有可接受的性能。
至于碰撞,那是hash_map
要处理的,你不用担心它。