我必须编写一个哈希函数,以便我可以在std::pair<int,std::string>
中放置unordered_set
。
关于输入:
使用字符串的哈希值(作为数字)是否有意义,并且只使用Cantor的对的枚举来生成“新”哈希?
由于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
}
};
答案 0 :(得分:5)
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;
}
};
答案 1 :(得分:3)
是的,您将为每个具有哈希函数的类型生成哈希值。
将独占或哈希组合起来是正常的:
int hash1;
int hash2;
int combined = hash1 ^ hash2;