如何为无序映射C ++ 14包含更好的位混合器

时间:2017-02-23 16:27:57

标签: c++ c++11 hashtable c++14 unordered-map

如何合并以下位混合代码以最小化unordered_map内的哈希冲突?意图有助于无序映射的内部散列方案执行比特混合器策略以最小化散列冲突。作为一个菜鸟,即使在阅读文档之后我也无法弄清楚如何做到这一点。

componentDidMount() {
    this.props.alertCallback("OHHHH NOOOO!!!!", "Something has gone wrong!");
    this.fetchFromApi();
}

已发布的代码来自site

以下是完整的代码(测试代码),只是为了获得MurmurHash3Mixer'包含在' std :: unordered_map'哈希计划。

UInt64 MurmurHash3Mixer( UInt64 key )
  {
  key ^= (key >> 33);
  key *= 0xff51afd7ed558ccd;
  key ^= (key >> 33);
  key *= 0xc4ceb9fe1a85ec53;
  key ^= (key >> 33);

  return key;
  }

2 个答案:

答案 0 :(得分:2)

您需要设置一个接受const Key&的函数对象。并返回size_t。然后在创建无序地图时将其作为模板传递

struct myhash
{
   size_t operator() (const UInt64 &key)
   {
      return (size_t) MurmurHash3Mixer(key):
   }
}

std::unordered_map<uint64_t, uint64_t, myhash> ht;

答案 1 :(得分:0)

只是为有相同问题的人添加更正后的代码。

#include <iostream>
#include <unordered_map>

uint64_t MurmurHash3Mixer( uint64_t key ) {
    key ^= (key >> 33);
    key *= 0xff51afd7ed558ccd;
    key ^= (key >> 33);
    key *= 0xc4ceb9fe1a85ec53;
    key ^= (key >> 33);

    return key;
}

struct myhash {
   std::size_t operator() (const uint64_t &key) const {
      return (size_t) MurmurHash3Mixer(key);
    }
};


int main() {

    uint64_t tx = 10L;
    std::unordered_map<uint64_t, uint64_t, myhash> ht;
    ht.insert(std::make_pair<uint64_t, uint64_t>(tx, 20));
    std::cout << ht[tx] << std::endl;

    return 0;
}