我必须编写一个哈希函数,以便可以将std::pair<int,std::string>
放在unordered_set
中。
关于输入:
使用字符串的哈希(作为数字),并仅使用Cantor对的枚举来生成"new"哈希,是否有意义?
由于
std::string
的“内置”哈希函数应该是一个不错的哈希函数... struct intStringHash{
public:
inline std::size_t operator()(const std::pair<int,std::string>&c)const{
int x = c.first;
std::string s = c.second;
std::hash<std::string> stringHash;
int y = stringHash(s);
return ((x+y)*(x+y+1)/2 + y); // Cantor's enumeration of pairs
}
};
最佳答案
boost::hash_combine
是创建哈希的一种简单方法:即使您无法使用Boost,该函数也非常简单,因此就是trivial to copy the implementation。
用法样本:
struct intStringHash
{
public:
std::size_t operator()(const std::pair<int, std::string>& c) const
{
std::size_t hash = 0;
hash_combine(hash, c.first);
hash_combine(hash, c.second);
return hash;
}
};