一起散列字符串和int?

时间:2016-09-01 09:59:59

标签: c++ c++11 hash

我必须编写一个哈希函数,以便我可以在std::pair<int,std::string>中放置unordered_set

关于输入:

  1. 将要散列的字符串非常小(长度为1-3个字母)。
  2. 同样,整数将是无符号数,它们很小(远小于unsigned int的限制)。
  3. 使用字符串的哈希值(作为数字)是否有意义,并且只使用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
            }
        };
    

2 个答案:

答案 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;