c++ - How to properly hash a pair of pointers? -


i have std::unordered_map keys of type std::pair<t*, t*> (i.e., pair of pointers).

the code base has following hash functor defined:

struct pair_hash {   template<typename t>   std::size_t operator()(std::pair<t, t> const &p) {     return (std::hash<t>()(p.first) + 0x9e3779b9) ^ (std::hash<t>()(p.second) + 0x9e3779b9);   } }; 

and used as:

std::unordered_map<std::pair<t*, t*>, u, pair_hash> mydictionary; 

where u arbitrary object.

now hash functor displayed above must have issues because in vc++ gives me out of bounds crash in std::unordered_map::find.

q:

  • could hash functor problematic or behaviour attributed vc++ itself?
  • is there "proper/more proper" way hash pair of pointers?

return (std::hash<t>()(p.first) + 0x9e3779b9) ^ (std::hash<t>()(p.first) + 0x9e3779b9); //                                                                ^^^^^ //                                                              p.second! //                                                                         ^^^^^^^^^^ // choose different magic constant prevent collisions between (p1, p2) , (p2, p1) 

your function returning 0 every pair of pointers. therefore getting lots of collisions in unordered_map.


Comments

Popular posts from this blog

serialization - Convert Any type in scala to Array[Byte] and back -

matplotlib support failed in PyCharm on OSX -

python - Matplotlib: TypeError: 'AxesSubplot' object is not callable -