如何为各种模板类型构建哈希函数?

时间:2016-01-02 07:10:28

标签: c++ templates hashtable

我正在练习使用template构建一个可以接受不同类型的哈希表。

如何在编译时实现hashFunction不知道类型?

template<class K, class V>
class HashTable {
  public:
  vector<vector<Bucket<K, V> > > table;
  ...
  size_t hashFunction(const K &k) {
    //can't implement without knowing the runtime types
  }
}

我猜我应该做类似的事情:

return hash<K>(k) % table.size();

更新

感谢R Sahu的回答,现在我知道这是我不清楚的模板部分专业化部分。请参阅this问题和this link以供参考。

1 个答案:

答案 0 :(得分:3)

  

如何在编译时实现hashFunction不知道类型?

您可以使用可用于为所有类型生成哈希值的通用逻辑。将组成k的字节视为字符串中的字符。

此外,为用户提供提供自己的哈希函数的能力。

// Generic implementation
template <typename K> struct Hash
{
   static size_t get(const K& k)
   {
      ...
   }
};

template<class K, class V, typename HashGenerator = Hash<K>>
class HashTable {
  public:
  vector<vector<Bucket<K, V> > > table;
  ...
  size_t hashFunction(const K &k) {
     HashGenerator::get(k);
  }
}

struct Foo { ... };

// Specialize Hash for Foo.
template <> struct Hash<Foo>
{
   static size_t get(const Foo& foo)
   {
      ...
   }
}