From 33f1f3d15f72ebd9f48704a3ec358d123ef60ea0 Mon Sep 17 00:00:00 2001 From: Tom Jackson Date: Wed, 13 Aug 2014 22:17:05 -0700 Subject: [PATCH] hash_range Test Plan: Unit test Reviewed By: andrei.alexandrescu@fb.com Subscribers: shilin FB internal diff: D1497250 --- folly/Hash.h | 13 +++++++++++++ folly/test/HashTest.cpp | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/folly/Hash.h b/folly/Hash.h index e372a862..109b24e4 100644 --- a/folly/Hash.h +++ b/folly/Hash.h @@ -59,6 +59,19 @@ inline size_t hash_combine_generic() { return 0; } +template < + class Iter, + class Hash = std::hash::value_type>> +uint64_t hash_range(Iter begin, + Iter end, + uint64_t hash = 0, + Hash hasher = Hash()) { + for (; begin != end; ++begin) { + hash = hash_128_to_64(hash, hasher(*begin)); + } + return hash; +} + template size_t hash_combine_generic(const T& t, const Ts&... ts) { size_t seed = Hasher::hash(t); diff --git a/folly/test/HashTest.cpp b/folly/test/HashTest.cpp index e1c6f658..8f2ee7e1 100644 --- a/folly/test/HashTest.cpp +++ b/folly/test/HashTest.cpp @@ -238,6 +238,19 @@ TEST(Hash, std_tuple) { EXPECT_EQ("bar", m[t]); } +namespace { +template +size_t hash_vector(const std::vector& v) { + return hash_range(v.begin(), v.end()); +} +} + +TEST(Hash, hash_range) { + EXPECT_EQ(hash_vector({1, 2}), hash_vector({1, 2})); + EXPECT_NE(hash_vector({2, 1}), hash_vector({1, 2})); + EXPECT_EQ(hash_vector({}), hash_vector({})); +} + TEST(Hash, std_tuple_different_hash) { typedef std::tuple tuple3; tuple3 t1(42, "foo", 1); -- 2.34.1