如何在c++中实现泛型哈希函数
How to implement a generic hash function in C++
我试图通过模板在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;
}
}
似乎不可能编写自己的哈希器,这对大多数类型都没问题,因为相等运算符可能会以某种复杂的方式被覆盖
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 错误处理.将系统错误代码映射到泛型
- 使用Qt C++计算类似Git的SHA1哈希
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 用C++将哈希表写入文件并从文件中恢复
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 链表的泛型函数remove()与成员函数remove)
- c++找不到具有相同哈希的无序集合元素
- 哈希文件递归并保存到矢量Cryptopp中
- 对 pair<pair<int,int>pair<int,int unordered_map进行哈希处理>>
- 直接在 unordered_map 的方法中使用哈希,而不是生成哈希的用户定义对象
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 模板化接口 - 创建一个泛型模板类以返回任何容器
- 如何为字符串生成唯一但一致的 N 位哈希(小于 64 位)?
- 使用对象的基类部分模板专用化对对象进行哈希处理::哈希
- boost::包含提升单元的元组的哈希值
- c++中字符串到整型的哈希函数
- 如何在c++中实现泛型哈希函数
- 什么是整型数对的快速哈希函数?