|
|
@@ -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
|