对一对整数(pair<int, int>)向量的哈希函数
hash function for a vector of pair<int, int>
我试图实现一个unordered_map为一个矢量<一对&>>。由于没有这样的默认哈希函数,我试着想象一个我自己的函数:
struct ObjectHasher
{
std::size_t operator()(const Object& k) const
{
std::string h_string("");
for (auto i = k.vec.begin(); i != k.vec.end(); ++i)
{
h_string.push_back(97+i->first);
h_string.push_back(47); // '-'
h_string.push_back(97+i->second);
h_string.push_back(43); // '+'
}
return std::hash<std::string>()(h_string);
}
};
主要思想是将整数列表,如((97,98), (105,107))更改为格式化字符串,如"a-b+i-k",并通过hash <计算其哈希值;字符串>()。我选择了97、48和43这三个数字,只是为了在测试过程中方便地在终端上显示散列字符串。
我知道这种函数可能是一个非常幼稚的想法,因为一个好的哈希函数应该是快速和强对抗碰撞。嗯,如果给push_back()的整数大于255,我不知道会发生什么……那么,你觉得下面的问题怎么样?- (1)是我的函数ok大整数?
- (2)我的功能是否适用于所有环境/平台?
- (3)我的函数太慢,不能作为哈希函数吗?
- (4)……还有更好的吗?
您所需要的只是一个"散列"一个整数的函数。您可以从boost中窃取这样的函数:
template <class T>
inline void hash_combine(std::size_t& seed, const T& v)
{
std::hash<T> hasher;
seed ^= std::hash<T>(v) + 0x9e3779b9 + (seed<<6) + (seed>>2);
}
现在你的函数是平凡的:
struct ObjectHasher
{
std::size_t operator()(const Object& k) const
{
std::size_t hash = 0;
for (auto i = k.vec.begin(); i != k.vec.end(); ++i)
{
hash_combine(hash, i->first);
hash_combine(hash, i->second);
}
return hash;
}
};
与其他散列函数相比,这个函数可能非常慢,因为它使用动态内存分配。std::hash<std::string>
也不是一个很好的哈希函数,因为它很一般。对所有int进行异或并使用std::hash<int>
可能更好。
这是一个完全有效的解决方案。哈希函数所需要的只是一个字节序列,通过将元素连接在一起作为字符串,您提供了映射的唯一字节表示。
当然,如果您的地图包含大量的项目,这可能会变得难以控制。
相关文章:
- 函数中的默认"常量<int>向量 &id"参数
- 将彼此平行的两个 int 向量的元素求和
- 向量的向量 int 向量
- 通过 fstream 函数初始化 int 向量??C++
- 如何调用一个函数,该函数用一个int向量取几个int
- 重载 C++ 运算符>>,以便我可以读取向量(向量<int>向量;
- 如何定义包含int向量的sruct的少算子
- 如何使用具有 pair<int,int 向量的元素unordered_set>
- OpenCV C++:从存储在 int 向量的索引中为垫子类型数据创建列范围
- 如何在不复制的情况下将只读向量传递给作为<int> pair<int,int>向量一部分的函数
- 在C++中,将两个长度相同的int向量转换为一个成对的int向量
- 使用int向量的向量对int向量进行基数排序
- 如何移除包含int向量的结构的向量
- 将一串数字解析为int向量的最快方法
- 删除c风格的int向量数组
- 从对象打印2D int向量
- 如何从文件中取出整数并将它们放入int向量中?
- 为什么 std::transform 不将 std::string 向量转换为无符号的 int 向量?
- 用C++11从点的向量中创建一个int向量
- 对已转换为字符串的int向量进行排序