hash_range
authorTom Jackson <tjackson@fb.com>
Thu, 14 Aug 2014 05:17:05 +0000 (22:17 -0700)
committerSara Golemon <sgolemon@fb.com>
Tue, 9 Sep 2014 21:22:22 +0000 (14:22 -0700)
Test Plan: Unit test

Reviewed By: andrei.alexandrescu@fb.com

Subscribers: shilin

FB internal diff: D1497250

folly/Hash.h
folly/test/HashTest.cpp

index e372a8625c6bdf067c0de6f97dd98de249817fb9..109b24e40e5478b1a2954c6b108376a02d76c9b5 100644 (file)
@@ -59,6 +59,19 @@ inline size_t hash_combine_generic() {
   return 0;
 }
 
+template <
+    class Iter,
+    class Hash = std::hash<typename std::iterator_traits<Iter>::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 <class Hasher, typename T, typename... Ts>
 size_t hash_combine_generic(const T& t, const Ts&... ts) {
   size_t seed = Hasher::hash(t);
index e1c6f658e9046bbacbe98e5c1c49dbd093448c4a..8f2ee7e19f0afeea04f5fdde6800a863ee0b8643 100644 (file)
@@ -238,6 +238,19 @@ TEST(Hash, std_tuple) {
   EXPECT_EQ("bar", m[t]);
 }
 
+namespace {
+template <class T>
+size_t hash_vector(const std::vector<T>& v) {
+  return hash_range(v.begin(), v.end());
+}
+}
+
+TEST(Hash, hash_range) {
+  EXPECT_EQ(hash_vector<int32_t>({1, 2}), hash_vector<int16_t>({1, 2}));
+  EXPECT_NE(hash_vector<int>({2, 1}), hash_vector<int>({1, 2}));
+  EXPECT_EQ(hash_vector<int>({}), hash_vector<float>({}));
+}
+
 TEST(Hash, std_tuple_different_hash) {
   typedef std::tuple<int64_t, std::string, int32_t> tuple3;
   tuple3 t1(42, "foo", 1);