Merge pull request #4624 from eughermann/hash-ub-fix

Fix undefined behavior in hash function.
pull/4382/merge
Adam Cozzette 7 years ago committed by GitHub
commit e232038e06
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 14
      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

Loading…
Cancel
Save