aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Cozzette <acozzette@gmail.com>2018-05-15 16:33:01 -0700
committerGitHub <noreply@github.com>2018-05-15 16:33:01 -0700
commite232038e061ad99225a1c568fca24181416461ef (patch)
tree93c54db1cc798d7f954c6579afe5e82762449635
parent6ab3196daec75c7a236fe65d4f8ba57b1b7d4b64 (diff)
parent72d18e3faa7c04c6f6d4522338afbc57422df171 (diff)
downloadprotobuf-e232038e061ad99225a1c568fca24181416461ef.tar.gz
protobuf-e232038e061ad99225a1c568fca24181416461ef.tar.bz2
protobuf-e232038e061ad99225a1c568fca24181416461ef.zip
Merge pull request #4624 from eughermann/hash-ub-fix
Fix undefined behavior in hash function.
-rw-r--r--src/google/protobuf/descriptor.cc14
1 files changed, 7 insertions, 7 deletions
diff --git a/src/google/protobuf/descriptor.cc b/src/google/protobuf/descriptor.cc
index d466dd8b..dae24f9e 100644
--- a/src/google/protobuf/descriptor.cc
+++ b/src/google/protobuf/descriptor.cc
@@ -406,9 +406,10 @@ typedef std::pair<const EnumDescriptor*, int> EnumIntPair;
template<typename PairType>
struct PointerIntegerPairHash {
size_t operator()(const PairType& p) const {
- // FIXME(kenton): What is the best way to compute this hash? I have
- // no idea! This seems a bit better than an XOR.
- return reinterpret_cast<intptr_t>(p.first) * ((1 << 16) - 1) + p.second;
+ static const size_t prime1 = 16777499;
+ static const size_t prime2 = 16777619;
+ return reinterpret_cast<size_t>(p.first) * prime1 ^
+ static_cast<size_t>(p.second) * prime2;
}
#ifdef _MSC_VER
@@ -424,11 +425,10 @@ struct PointerIntegerPairHash {
struct PointerStringPairHash {
size_t operator()(const PointerStringPair& p) const {
- // FIXME(kenton): What is the best way to compute this hash? I have
- // no idea! This seems a bit better than an XOR.
+ static const size_t prime = 16777619;
hash<const char*> cstring_hash;
- return reinterpret_cast<intptr_t>(p.first) * ((1 << 16) - 1) +
- cstring_hash(p.second);
+ return reinterpret_cast<size_t>(p.first) * prime ^
+ static_cast<size_t>(cstring_hash(p.second));
}
#ifdef _MSC_VER