diff options
author | David Storch <david.storch@10gen.com> | 2016-07-15 18:15:12 -0400 |
---|---|---|
committer | David Storch <david.storch@10gen.com> | 2016-07-19 22:35:21 -0400 |
commit | 7e986cc77f121e3af9a5f1217e89913745fc07f9 (patch) | |
tree | e29c4ec325199937b2723a500a462e6c125616ea /src/mongo/base | |
parent | 0b32158c9cb44b31078ca923ef5c8fff755c952a (diff) | |
download | mongo-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.cpp | 14 | ||||
-rw-r--r-- | src/mongo/base/simple_string_data_comparator.h | 2 | ||||
-rw-r--r-- | src/mongo/base/string_data_comparator_interface.h | 12 |
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. |