我想存儲在地圖對象包裝網絡連接,其中密鑰應該是IP地址+端口號。std :: unordered_map和關鍵內置的多個元素
我的問題是我應該如何處理這兩個元素的關鍵?
我可以定義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地址和端口號建立一個字符串,但我只是好奇)。
如果您解釋了「ip_hash」和「port_hash」的含義,提供建議會更容易。尤其是後者 - 一個端口號可以很好地用作自己的散列(即散列==標識)。如果您不希望來自同一個IP地址的多個連接,您甚至可以完全避免使用該端口。 – Jon
@Jon好吧,我將有來自同一個IP的多個連接,因爲這個軟件將在局域網中與幾個NAT一起使用。 – Goofy
該解決方案看起來不錯,但我會結合這些值使用XOR而不是加法,因爲添加會混淆分佈。 – Johan