STL的hash_map中的碰撞检测

时间:2010-06-19 05:23:17

标签: c++ stl hashmap

我必须为函数指针(作为值)创建一个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;
}

2 个答案:

答案 0 :(得分:0)

您不需要处理碰撞。另外,我认为已经定义了std :: hash,所以你不必担心哈希函数。

答案 1 :(得分:0)

假设你已经拥有完整的STL,它实际上包含一个哈希函数hash<T>,其包含的形式是suitable for a few different key types,包括char *(C字符串)。我不知道它的性能细节,但STL通常被设计成对大多数应用程序具有可接受的性能。

至于碰撞,那是hash_map要处理的,你不用担心它。