Вам понадобится коммутативная функция объединения, которая boost::hash_combine
намеренно не равна , поэтому равные unordered_map
, имеющие различный внутренний порядок, имеют одинаковые хэши.Для этого я предлагаю просто кешировать хэш каждого элемента.
template<typename UnorderedMap>
std::size_t hash(const UnorderedMap & um)
{
boost::hash<typename UnorderedMap::value_type> elem_hash;
auto combine = [&](size_t acc, typename UnorderedMap::const_reference elem){ return acc ^ elem_hash(elem); };
return std::accumulate(um.begin(), um.end(), 0, combine);
}