如何在c++中实现泛型哈希函数

How to implement a generic hash function in C++

本文关键字:泛型 哈希 函数 实现 c++      更新时间:2023-10-16

我试图通过模板在c++中实现HashTable。这是签名:

template<class T1, class T2>
class HashTable {
public:
void add(T1 a, T2 b);
void hashFunction(T1 key, T2 value)
{
// how to implement this function using key as a generic 
// we need to know the object type of key
}
};

因此,我无法继续执行涉及通用键的实现。

在Java中,我可以很容易地将键转换为string,然后很高兴地将键的哈希实现为string。但是,在c++中,我所知道的是有一个RTTI的概念,它可以动态地将对象转换为所需的对象。

如果这个方法是正确的,如何实现动态强制转换?

如果在这种情况下使用模板不是实现泛型的正确方法,那么请建议一些更好的方法。

您通常会使用std::hash,并让类型实现者根据需要对该模板进行专门化。

size_t key_hash = std::hash<T1>()(key);

对于给定的任意随机类型,你都不可能通用地实现哈希函数。如果两个对象相等,它们的哈希码必须相同。您可以简单地通过散列函数运行对象的原始内存,但是这些类型可能会实现operator==过载,从而忽略某些对象数据(例如,同步对象)。在这种情况下,您可能(而且非常容易)为相等的对象返回不同的哈希值。

键和值都要散列,这很奇怪。您如何能够仅通过它后面的键获得值?

如果你正在使用c++ 11,好主意是使用std::hash<T1>,提供了一些类型(整数,字符串,指针),也许专门为其他类。此外,允许使用第三个模板参数类来更改它也是个好主意。看看unordered_map是如何完成的

template<typename K, typename V, typename H = std::hash<T>>
class HashTable {
   //...
   void hashFunction(const T1& key) {
        hash = H()(key);
        //process hash somehow, probably you need get reminder after division to number of buckets or something same
        return hash % size;
   }
}

似乎不可能编写自己的哈希器,这对大多数类型都没问题,因为相等运算符可能会以某种复杂的方式被覆盖