summaryrefslogtreecommitdiff
path: root/src/mongo/base
diff options
context:
space:
mode:
authorDavid Storch <david.storch@10gen.com>2016-07-15 18:15:12 -0400
committerDavid Storch <david.storch@10gen.com>2016-07-19 22:35:21 -0400
commit7e986cc77f121e3af9a5f1217e89913745fc07f9 (patch)
treee29c4ec325199937b2723a500a462e6c125616ea /src/mongo/base
parent0b32158c9cb44b31078ca923ef5c8fff755c952a (diff)
downloadmongo-7e986cc77f121e3af9a5f1217e89913745fc07f9.tar.gz
SERVER-23990 add ValueComparator::Hasher for collation-aware Value hashing
Diffstat (limited to 'src/mongo/base')
-rw-r--r--src/mongo/base/simple_string_data_comparator.cpp14
-rw-r--r--src/mongo/base/simple_string_data_comparator.h2
-rw-r--r--src/mongo/base/string_data_comparator_interface.h12
3 files changed, 19 insertions, 9 deletions
diff --git a/src/mongo/base/simple_string_data_comparator.cpp b/src/mongo/base/simple_string_data_comparator.cpp
index e52539744fc..f9077f942b2 100644
--- a/src/mongo/base/simple_string_data_comparator.cpp
+++ b/src/mongo/base/simple_string_data_comparator.cpp
@@ -40,19 +40,19 @@ namespace mongo {
namespace {
template <int SizeofSizeT>
-size_t murmur3(StringData str);
+size_t murmur3(StringData str, size_t seed);
template <>
-size_t murmur3<4>(StringData str) {
+size_t murmur3<4>(StringData str, size_t seed) {
char hash[4];
- MurmurHash3_x86_32(str.rawData(), str.size(), 0, &hash);
+ MurmurHash3_x86_32(str.rawData(), str.size(), seed, &hash);
return ConstDataView(hash).read<LittleEndian<std::uint32_t>>();
}
template <>
-size_t murmur3<8>(StringData str) {
+size_t murmur3<8>(StringData str, size_t seed) {
char hash[16];
- MurmurHash3_x64_128(str.rawData(), str.size(), 0, hash);
+ MurmurHash3_x64_128(str.rawData(), str.size(), seed, hash);
return static_cast<size_t>(ConstDataView(hash).read<LittleEndian<std::uint64_t>>());
}
@@ -64,8 +64,8 @@ int SimpleStringDataComparator::compare(StringData left, StringData right) const
return left.compare(right);
}
-size_t SimpleStringDataComparator::hash(StringData stringToHash) const {
- return murmur3<sizeof(size_t)>(stringToHash);
+void SimpleStringDataComparator::hash_combine(size_t& seed, StringData stringToHash) const {
+ seed = murmur3<sizeof(size_t)>(stringToHash, seed);
}
} // namespace mongo
diff --git a/src/mongo/base/simple_string_data_comparator.h b/src/mongo/base/simple_string_data_comparator.h
index c494a034726..77a8d0e1ef7 100644
--- a/src/mongo/base/simple_string_data_comparator.h
+++ b/src/mongo/base/simple_string_data_comparator.h
@@ -45,7 +45,7 @@ public:
int compare(StringData left, StringData right) const override;
- size_t hash(StringData stringToHash) const override;
+ void hash_combine(size_t& seed, StringData stringToHash) const override;
};
} // namespace mongo
diff --git a/src/mongo/base/string_data_comparator_interface.h b/src/mongo/base/string_data_comparator_interface.h
index ac4654a479a..c5e730bc1c0 100644
--- a/src/mongo/base/string_data_comparator_interface.h
+++ b/src/mongo/base/string_data_comparator_interface.h
@@ -94,7 +94,17 @@ public:
/**
* Hash a StringData in a way that respects this comparator.
*/
- virtual size_t hash(StringData stringToHash) const = 0;
+ size_t hash(StringData stringToHash) const {
+ size_t seed = 0;
+ hash_combine(seed, stringToHash);
+ return seed;
+ }
+
+ /**
+ * Hash a StringData in a way that respects this comparator, and return the result in the 'seed'
+ * in-out parameter.
+ */
+ virtual void hash_combine(size_t& seed, StringData stringToHash) const = 0;
/**
* Returns a function object which can evaluate string equality according to this comparator.