mardi 23 juin 2015

unordered_map::find with key std::pair of pointers with custom hash crashes in VS2012

I needed a std::unordered_map with key a std::pair<T*, T*> so I "stole" the following code:

template <class T>
inline void hash_combine(std::size_t & seed, const T & v)
{
  std::hash<T> hasher;
  seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}

namespace std
{
  template<typename S, typename T> struct hash<pair<S, T>>
  {
    inline size_t operator()(const pair<S, T> & v) const
    {
      size_t seed = 0;
      ::hash_combine(seed, v.first);
      ::hash_combine(seed, v.second);
      return seed;
    }
  };
}

from this stackoverflow answer.

It works like a charm on linux machines with gcc 4.9.2. However in windows visual studio 2012 it crashes upon calling member function find() of my unordered_map. A friend of mine debugged the crash on windows machine and he reported that it breaks only in debug compilation mode by giving "vector subscript out of range".

Q:

  1. Is the code posted valid for hashing a std::pair<T*, T*>?
  2. Is there a more robust/better way of hashing a std::pair<T*, T*>?
  3. What causes this strange behaviour?

P.S: Deeply sorry for not posting a mcve but It's impossible to do so.

Aucun commentaire:

Enregistrer un commentaire