mirror of
https://github.com/clearlinux/folly.git
synced 2026-06-16 01:45:48 +00:00
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
This commit is contained in:
committed by
Praveen Kumar Ramakrishnan
parent
675a137da2
commit
5cc2f9945c
@@ -338,6 +338,13 @@ inline uint32_t hsieh_hash32_str(const std::string& str) {
|
||||
template<class Key>
|
||||
struct hasher;
|
||||
|
||||
struct Hash {
|
||||
template <class T>
|
||||
size_t operator()(const T& v) const {
|
||||
return hasher<T>()(v);
|
||||
}
|
||||
};
|
||||
|
||||
template<> struct hasher<int32_t> {
|
||||
size_t operator()(int32_t key) const {
|
||||
return hash::jenkins_rev_mix32(uint32_t(key));
|
||||
|
||||
@@ -22,6 +22,8 @@
|
||||
|
||||
#include <folly/Portability.h>
|
||||
#include <folly/FBString.h>
|
||||
#include <folly/SpookyHashV2.h>
|
||||
|
||||
#include <algorithm>
|
||||
#include <boost/operators.hpp>
|
||||
#include <climits>
|
||||
@@ -1121,6 +1123,16 @@ inline size_t qfind_first_of(const Range<const unsigned char*>& haystack,
|
||||
return detail::qfind_first_byte_of(StringPiece(haystack),
|
||||
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
|
||||
|
||||
#pragma GCC diagnostic pop
|
||||
|
||||
@@ -262,3 +262,31 @@ TEST(Hash, std_tuple_different_hash) {
|
||||
EXPECT_NE(std::hash<tuple3>()(t1),
|
||||
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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user