我具有用于向量的unordered_set的自定义哈希函数
struct VectorHash {
int operator()(const vector<int> &V) const {
int hsh=V[0] + V[1];
return hash<int>()(hsh);
}};
并且对于两个这样的向量,我具有相同的哈希等于3:
vector<int> v1{2,1};
vector<int> v2{1,2};
但是当我尝试在unordered_set中插入第一个向量v1,然后检查我的unordered_set中是否通过散列与v2具有相同的向量时,我得到了假:
std::unordered_set<std::vector<int>, VectorHash> mySet;
mySet.insert(v1);
if(mySet.find(v2) == mySet.end())
cout << "didn't find" << endl;
Output: "didn't find"
[我假设如果unordered_set中的两个元素具有相同的哈希,那么如果我的unordered_set中具有v1,则当我尝试查找v2时,find
方法应该返回true。事实并非如此。
任何人都可以向我解释我的推理有什么问题吗?
[我假设如果unordered_set中的两个元素具有相同的哈希,那么如果我的unordered_set中具有v1,则当我尝试查找v2时,find方法应该返回true。
这种假设是不正确的,相同的哈希并不意味着对象相等。
unordered_map
使用相等谓词确定对象相等(默认为std::equal_to
)。
哈希不是全部,您在这里看到的是碰撞。
std::vector<int>
在这里都具有相同的哈希值,但是在计算完哈希后,std::unordered_map
实际上会使用operator==
检查元素是否相等,实际上检查元素是否相等,这种情况下将失败,并且找到元素。
冲突是HashMaps中的正常现象,在没有提供自定义operator==
的情况下,您在这里可以做的很多。