Commit 5cc2f994 authored by Tom Jackson's avatar Tom Jackson Committed by Praveen Kumar Ramakrishnan

Add SpookyHashV2-based hash to StringPiece

Summary: Since the old one is weak and slow.

Test Plan: Unit tests

Reviewed By: ott@fb.com

Subscribers: trunkagent, maxime, folly-diffs@, yfeldblum, chalfant

FB internal diff: D2052630

Tasks: 6998080

Signature: t1:2052630:1431015271:bc90ccf99941902cd4bd43a0980238c616e66abf
parent 675a137d
...@@ -338,6 +338,13 @@ inline uint32_t hsieh_hash32_str(const std::string& str) { ...@@ -338,6 +338,13 @@ inline uint32_t hsieh_hash32_str(const std::string& str) {
template<class Key> template<class Key>
struct hasher; struct hasher;
struct Hash {
template <class T>
size_t operator()(const T& v) const {
return hasher<T>()(v);
}
};
template<> struct hasher<int32_t> { template<> struct hasher<int32_t> {
size_t operator()(int32_t key) const { size_t operator()(int32_t key) const {
return hash::jenkins_rev_mix32(uint32_t(key)); return hash::jenkins_rev_mix32(uint32_t(key));
......
...@@ -22,6 +22,8 @@ ...@@ -22,6 +22,8 @@
#include <folly/Portability.h> #include <folly/Portability.h>
#include <folly/FBString.h> #include <folly/FBString.h>
#include <folly/SpookyHashV2.h>
#include <algorithm> #include <algorithm>
#include <boost/operators.hpp> #include <boost/operators.hpp>
#include <climits> #include <climits>
...@@ -1121,6 +1123,16 @@ inline size_t qfind_first_of(const Range<const unsigned char*>& haystack, ...@@ -1121,6 +1123,16 @@ inline size_t qfind_first_of(const Range<const unsigned char*>& haystack,
return detail::qfind_first_byte_of(StringPiece(haystack), return detail::qfind_first_byte_of(StringPiece(haystack),
StringPiece(needles)); StringPiece(needles));
} }
template<class Key>
struct hasher;
template <class T> struct hasher<folly::Range<T*>> {
size_t operator()(folly::Range<T*> r) const {
return hash::SpookyHashV2::Hash64(r.begin(), r.size() * sizeof(T), 0);
}
};
} // !namespace folly } // !namespace folly
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
......
...@@ -262,3 +262,31 @@ TEST(Hash, std_tuple_different_hash) { ...@@ -262,3 +262,31 @@ TEST(Hash, std_tuple_different_hash) {
EXPECT_NE(std::hash<tuple3>()(t1), EXPECT_NE(std::hash<tuple3>()(t1),
std::hash<tuple3>()(t3)); std::hash<tuple3>()(t3));
} }
TEST(Range, Hash) {
using namespace folly;
StringPiece a1 = "10050517", b1 = "51107032",
a2 = "10050518", b2 = "51107033",
a3 = "10050519", b3 = "51107034",
a4 = "10050525", b4 = "51107040";
Range<const wchar_t*> w1 = range(L"10050517"), w2 = range(L"51107032"),
w3 = range(L"10050518"), w4 = range(L"51107033");
StringPieceHash h1;
Hash h2;
EXPECT_EQ(h1(a1), h1(b1));
EXPECT_EQ(h1(a2), h1(b2));
EXPECT_EQ(h1(a3), h1(b3));
EXPECT_EQ(h1(a4), h1(b4));
EXPECT_NE(h2(a1), h2(b1));
EXPECT_NE(h2(a1), h2(b1));
EXPECT_NE(h2(a2), h2(b2));
EXPECT_NE(h2(a3), h2(b3));
EXPECT_NE(h2(ByteRange(a1)), h2(ByteRange(b1)));
EXPECT_NE(h2(ByteRange(a2)), h2(ByteRange(b2)));
EXPECT_NE(h2(ByteRange(a3)), h2(ByteRange(b3)));
EXPECT_NE(h2(ByteRange(a4)), h2(ByteRange(b4)));
EXPECT_NE(h2(w1), h2(w2));
EXPECT_NE(h2(w1), h2(w3));
EXPECT_NE(h2(w2), h2(w4));
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment