diff --git a/include/boost/json/impl/array.ipp b/include/boost/json/impl/array.ipp index dee3aea0..7e53e3a3 100644 --- a/include/boost/json/impl/array.ipp +++ b/include/boost/json/impl/array.ipp @@ -761,20 +761,18 @@ BOOST_JSON_NS_END // //---------------------------------------------------------- -namespace std { -std::size_t -hash<::boost::json::array>::operator()( - ::boost::json::array const& ja) const noexcept +std::size_t +std::hash<::boost::json::array>::operator()( + ::boost::json::array const& ja) const noexcept { std::size_t seed = ja.size(); for (const auto& jv : ja) { - seed = boost::json::detail::hash_combine( - seed, + seed = ::boost::json::detail::hash_combine( + seed, std::hash<::boost::json::value>{}(jv)); } - return seed; + return seed; }; -} //---------------------------------------------------------- diff --git a/include/boost/json/impl/object.ipp b/include/boost/json/impl/object.ipp index 9b245404..ca36ab29 100644 --- a/include/boost/json/impl/object.ipp +++ b/include/boost/json/impl/object.ipp @@ -829,22 +829,21 @@ BOOST_JSON_NS_END // //---------------------------------------------------------- -namespace std { -std::size_t -hash<::boost::json::object>::operator()( - ::boost::json::object const& jo) const noexcept +std::size_t +std::hash<::boost::json::object>::operator()( + ::boost::json::object const& jo) const noexcept { std::size_t seed = jo.size(); for (const auto& kv_pair : jo) { - const auto hk = std::hash{}(kv_pair.key()); - const auto hkv = boost::json::detail::hash_combine( - hk, - std::hash{}(kv_pair.value())); - seed = boost::json::detail::hash_combine_commutative(seed, hkv); + auto const hk = ::boost::json::detail::digest( + kv_pair.key().data(), kv_pair.key().size(), 0); + auto const hkv = ::boost::json::detail::hash_combine( + hk, + std::hash<::boost::json::value>{}(kv_pair.value())); + seed = ::boost::json::detail::hash_combine_commutative(seed, hkv); } return seed; }; -} //---------------------------------------------------------- diff --git a/include/boost/json/impl/value.ipp b/include/boost/json/impl/value.ipp index 665453db..9e35b99c 100644 --- a/include/boost/json/impl/value.ipp +++ b/include/boost/json/impl/value.ipp @@ -501,10 +501,9 @@ BOOST_JSON_NS_END // //---------------------------------------------------------- -namespace std { -std::size_t -hash<::boost::json::value>::operator()( - ::boost::json::value const& jv) const noexcept +std::size_t +std::hash<::boost::json::value>::operator()( + ::boost::json::value const& jv) const noexcept { std::size_t seed = static_cast(jv.kind()); switch (jv.kind()) { @@ -512,36 +511,35 @@ hash<::boost::json::value>::operator()( case ::boost::json::kind::null: return seed; case ::boost::json::kind::bool_: - return boost::json::detail::hash_combine( - seed, + return ::boost::json::detail::hash_combine( + seed, hash{}(jv.get_bool())); case ::boost::json::kind::int64: - return boost::json::detail::hash_combine( - seed, + return ::boost::json::detail::hash_combine( + seed, hash{}(jv.get_int64())); case ::boost::json::kind::uint64: - return boost::json::detail::hash_combine( + return ::boost::json::detail::hash_combine( static_cast(::boost::json::kind::int64), hash{}(jv.get_uint64())); - case boost::json::kind::double_: - return boost::json::detail::hash_combine( - seed, + case ::boost::json::kind::double_: + return ::boost::json::detail::hash_combine( + seed, hash{}(jv.get_double())); case ::boost::json::kind::string: - return boost::json::detail::hash_combine( - seed, + return ::boost::json::detail::hash_combine( + seed, hash<::boost::json::string>{}(jv.get_string())); case ::boost::json::kind::array: - return boost::json::detail::hash_combine( - seed, + return ::boost::json::detail::hash_combine( + seed, hash<::boost::json::array>{}(jv.get_array())); case ::boost::json::kind::object: - return boost::json::detail::hash_combine( - seed, + return ::boost::json::detail::hash_combine( + seed, hash<::boost::json::object>{}(jv.get_object())); } }; -} //----------------------------------------------------------