unordered_map :: find with key std :: par de punteros con bloqueos hash personalizados en VS2012

Necesitaba unstd::unordered_map con llave astd::pair<T*, T*> así que "robé" el siguiente código:

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;
    }
  };
}

de este stackoverflowresponder.

Funciona de maravilla en máquinas Linux con gcc 4.9.2. Sin embargo, en Windows Visual Studio 2012 se bloquea al llamar a la función miembrofind() de miunordered_map. Un amigo mío depuró el bloqueo en la máquina de Windows e informó que solo se rompe en el modo de compilación de depuración al dar "subíndice de vector fuera de rango".

Q:¿El código publicado es válido para hashing unstd::pair<T*, T*>?¿Existe una forma más robusta / mejor de hashing unstd::pair<T*, T*>?¿Qué causa este comportamiento extraño?

PD: lo siento mucho por no publicar unmcve Pero es imposible hacerlo.

Respuestas a la pregunta(1)

Su respuesta a la pregunta