From 92fc445f7c0d8158c5f26abab9049fcfbcd0ccff Mon Sep 17 00:00:00 2001 From: Abseil Team Date: Mon, 6 Feb 2023 15:23:40 -0800 Subject: Fix a discrepancy between absl::Hash and absl::HashOf for some negative signed integral types and improve the performance of absl::Hash. PiperOrigin-RevId: 507598042 Change-Id: I96a7bd6b9c360f435f216b2671ae84d9768a46e8 --- absl/hash/hash_test.cc | 15 +++++++++++++-- absl/hash/internal/hash.h | 3 ++- 2 files changed, 15 insertions(+), 3 deletions(-) (limited to 'absl/hash') diff --git a/absl/hash/hash_test.cc b/absl/hash/hash_test.cc index 5b556180..4ed6e50a 100644 --- a/absl/hash/hash_test.cc +++ b/absl/hash/hash_test.cc @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -1241,14 +1242,24 @@ TEST(HashTest, DoesNotUseImplicitConversionsToBool) { TEST(HashOf, MatchesHashForSingleArgument) { std::string s = "forty two"; - int i = 42; double d = 42.0; std::tuple t{4, 2}; + int i = 42; + int neg_i = -42; + int16_t i16 = 42; + int16_t neg_i16 = -42; + int8_t i8 = 42; + int8_t neg_i8 = -42; EXPECT_EQ(absl::HashOf(s), absl::Hash{}(s)); - EXPECT_EQ(absl::HashOf(i), absl::Hash{}(i)); EXPECT_EQ(absl::HashOf(d), absl::Hash{}(d)); EXPECT_EQ(absl::HashOf(t), (absl::Hash>{}(t))); + EXPECT_EQ(absl::HashOf(i), absl::Hash{}(i)); + EXPECT_EQ(absl::HashOf(neg_i), absl::Hash{}(neg_i)); + EXPECT_EQ(absl::HashOf(i16), absl::Hash{}(i16)); + EXPECT_EQ(absl::HashOf(neg_i16), absl::Hash{}(neg_i16)); + EXPECT_EQ(absl::HashOf(i8), absl::Hash{}(i8)); + EXPECT_EQ(absl::HashOf(neg_i8), absl::Hash{}(neg_i8)); } TEST(HashOf, MatchesHashOfTupleForMultipleArguments) { diff --git a/absl/hash/internal/hash.h b/absl/hash/internal/hash.h index ccf4cc1a..eb50e2c7 100644 --- a/absl/hash/internal/hash.h +++ b/absl/hash/internal/hash.h @@ -969,7 +969,8 @@ class ABSL_DLL MixingHashState : public HashStateBase { // The result should be the same as running the whole algorithm, but faster. template ::value, int> = 0> static size_t hash(T value) { - return static_cast(Mix(Seed(), static_cast(value))); + return static_cast( + Mix(Seed(), static_cast>(value))); } // Overload of MixingHashState::hash() -- cgit v1.2.3