我想存储包装网络连接的地图对象,其中密钥应该是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地址和端口号建立一个字符串,但我只是好奇)。
答案 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);
}
};