std :: unordered_map和由多个元素构建的键

时间:2013-11-26 23:28:53

标签: c++ c++11

我想存储包装网络连接的地图对象,其中密钥应该是IP地址+端口号。

我的问题是我应该如何使用两个元素处理这样的键?

我可以定义std::unordered_map<std::pair<std::string, uint16_t>, Connection>,但我不确定应该如何为它实现哈希对象。我只想到天真的实施:

std::size_t operator() (const pair<std::string, uint16_t>& key) const
{
    std::hash<std::string> ip_hash;
    std::hash<uint16_t>    port_hash;

    return ip_hash (key.first) + port_hash (port.second);
}

我认为简单地添加两个哈希值是个坏主意。在实现哈希函数时是否应遵守一般规则?

(我知道,我可以根据IP地址和端口号建立一个字符串,但我只是好奇)。

3 个答案:

答案 0 :(得分:1)

如果使用boost是一个选项,boost::hash_combine使这很容易(否则链接页面上的实现可用)。

std::size_t operator()(const pair<std::string, uint16_t>& key) const
{
    std::size_t seed = 0;
    boost::hash_combine(seed, key.first);
    boost::hash_combine(seed, key.second);
    return seed;
}

答案 1 :(得分:1)

一个简单的解决方案是将uint16_t端口号附加到字符串,表示IP地址。然后,您可以使用std:unordered_map<string, Connection>

答案 2 :(得分:0)

对于非安全实践,您的散列大多数都很好。您可以通过这种方式使其更加强大:

struct ip_port_hash
{
    size_t operator() (const std::pair< std::string, uint16_t >& key) const
    {
        std::hash<const char*> ip_hash;
        std::hash<size_t>      size_t_hash;

        return size_t_hash( ip_hash (key.first.c_str()) + key.second);
    }
};