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

关于输入:

  • 将被散列的字符串非常小(长度为1-3个字母)。
  • 同样,整数将是较小的无符号数字(比无符号int的限制小得多)。

  • 使用字符串的哈希(作为数字),并仅使用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;
        }
    };
    

    10-04 15:29
    查看更多