diff options
author | Adam Cozzette <acozzette@gmail.com> | 2018-05-15 16:33:01 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-05-15 16:33:01 -0700 |
commit | e232038e061ad99225a1c568fca24181416461ef (patch) | |
tree | 93c54db1cc798d7f954c6579afe5e82762449635 /src | |
parent | 6ab3196daec75c7a236fe65d4f8ba57b1b7d4b64 (diff) | |
parent | 72d18e3faa7c04c6f6d4522338afbc57422df171 (diff) |
Merge pull request #4624 from eughermann/hash-ub-fix
Fix undefined behavior in hash function.
Diffstat (limited to 'src')
-rw-r--r-- | src/google/protobuf/descriptor.cc | 14 |
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 |