АК
Идиома - делаешь свой hash в своем неймспейсе, чтобы ADL работал. При использовании пишешь
using std::hash;
... = hash(...);
И тогда будут цепляться и твой, и из std в зависимости от типа аргумента. Разумеется, using нужен только тогда, когда сам руками вызываешь этот метод явно, стандартное и так все будет работать "из коробки".
Тоже самое относится к swap и вообще ко всем свободным функциям.