From 034b81594df0589e0cee3f18c15fc7b5e0b60695 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Tue, 20 Sep 2022 14:49:37 +0300 Subject: [PATCH] Update 128 bit long double hash_value --- include/boost/container_hash/hash.hpp | 24 +++--------------------- test/hash_reference_values.cpp | 7 +++++++ 2 files changed, 10 insertions(+), 21 deletions(-) diff --git a/include/boost/container_hash/hash.hpp b/include/boost/container_hash/hash.hpp index 2bf8ae7..c0cc089 100644 --- a/include/boost/container_hash/hash.hpp +++ b/include/boost/container_hash/hash.hpp @@ -289,7 +289,7 @@ namespace boost }; // 128 bit long double - template struct hash_float_impl + template struct hash_float_impl { static std::size_t fn( T v ) { @@ -298,26 +298,8 @@ namespace boost std::size_t seed = 0; - seed = static_cast( w[0] ) + hash_detail::hash_mix( seed ); - seed = static_cast( w[1] ) + hash_detail::hash_mix( seed ); - - return seed; - } - }; - - template struct hash_float_impl - { - static std::size_t fn( T v ) - { - boost::uint32_t w[ 4 ]; - std::memcpy( &w, &v, sizeof( v ) ); - - std::size_t seed = 0; - - seed = static_cast( w[0] ) + hash_detail::hash_mix( seed ); - seed = static_cast( w[1] ) + hash_detail::hash_mix( seed ); - seed = static_cast( w[2] ) + hash_detail::hash_mix( seed ); - seed = static_cast( w[3] ) + hash_detail::hash_mix( seed ); + seed = hash_value( w[0] ) + hash_detail::hash_mix( seed ); + seed = hash_value( w[1] ) + hash_detail::hash_mix( seed ); return seed; } diff --git a/test/hash_reference_values.cpp b/test/hash_reference_values.cpp index df0ca6a..97646ed 100644 --- a/test/hash_reference_values.cpp +++ b/test/hash_reference_values.cpp @@ -249,6 +249,13 @@ int main() // ldbits == 128 && std::numeric_limits::digits == 113 // under ARM64 and S390x, but the values differ presumably because of // __FLOAT_WORD_ORDER__ + + BOOST_TEST_EQ( hv(1.0L), 4611404543450677248ULL ); + BOOST_TEST_EQ( hv(-1.0L), 13834776580305453056ULL ); + BOOST_TEST_EQ( hv(3.14L), 5967435363179612952ULL ); + BOOST_TEST_EQ( hv(-3.14L), 15190807400034388760ULL ); + BOOST_TEST_EQ( hv(std::numeric_limits::infinity()), 9223090561878065152ULL ); + BOOST_TEST_EQ( hv(-std::numeric_limits::infinity()), 18446462598732840960ULL ); } #endif