我遇到了一个问题,使用结构体作为键将数据放入unordered_map中:
typedef struct osdpi_flow_identificator {
u32 lower_ip;
u32 upper_ip;
u16 lower_port;
u16 upper_port;
u8 protocol;
} osdpi_flow_identificator_t;
// custom hash function for osdpi_flow_identificator
struct osdpi_flow_hash {
std::size_t operator() (osdpi_flow_identificator * key) const {
hash hash_function;
std::size_t returnValue =
hash_function(key->lower_ip)
+ hash_function(key->upper_ip)
+ hash_function(key->lower_port)
+ hash_function(key->upper_port)
+ hash_function(key->protocol);
printf(" calculated hash: %i\n", returnValue);
return returnValue;
}
};
typedef unordered_map <osdpi_flow_identificator*, osdpi_flow*, osdpi_flow_hash> osdpi_flows_hashmap;
typedef osdpi_flows_hashmap::value_type osdpi_flows_pair;
static osdpi_flows_hashmap osdpi_flows;
我的问题是哈希函数对于具有相同值的osdpi_flow_identificators返回相同的值,但是
(涉及it技术)
osdpi_flow_identificator * flow_id = new osdpi_flow_identificator;
osdpi_flows_hashmap::const_iterator iter;
iter = osdpi_flows.find(flow_id);
if (iter != osdpi_flows.end()) {
...
虽然哈希映射中已经有一个具有完全相同值的flow_id条目,但无序映射并未找到它。我通过输出整个哈希映射以及哈希函数打印出相同的值进行了验证。因此,很难理解为什么unordered_map无法找到具有相同哈希值的条目。
我还尝试过重载operator==和operator<,这是我在网络上找到的提示之一,但这些函数也没有被调用。
解决这个问题的方法是不初始化flow_id,但这当然最终会导致分段错误。
任何帮助都将不胜感激!
谢谢 Steffen