【问题标题】:How should I define my own hash function for unordered_map in C++我应该如何在 C++ 中为 unordered_map 定义我自己的哈希函数
【发布时间】:2014-11-11 17:29:15
【问题描述】:

我有一个图像补丁数据库,即 300*300 图像,每个补丁大小为 60*60。因此给了我一个 5*5 的网格。我想针对每个补丁存储一些信息。由于我的数据库可能包含数百万张图像,因此我想使用 unordered_map 以便轻松找到补丁。

我的patch信息由imgId、patch的x_position和patch的y_position组成(都是整数)。我对 unordered_map 没有太多经验。但是通过一些教程,我意识到我将不得不使用自己的哈希函数。任何人都可以提出一些有效的方法来使用适当的哈希函数将上述信息存储在 unordered_map 中。

【问题讨论】:

  • 您的哈希是基于您提供的识别句柄,还是基于数据库中的基础数据?
  • 使用std::hash<int> 并查看stackoverflow.com/questions/2590677/…
  • @Deduplicator 我需要根据 imgId,x 和 y 位置查找值。那就是它们的组合是主键。

标签: c++ hash hashtable unordered-map


【解决方案1】:

您可以使用任何您喜欢的散列函数来组合这三个整数。这是一个经典的 Knuth 32 位组合器:

int hash(int v1, int v2, int v3)
{
  int v = v1;
  v *= 2654435741;
  v += v2;
  v *= 2654435761;
  v ^= v3;
  v *= 2654435789;
  return v;
}

【讨论】:

  • 我认为这 3 个常数应该是素数但不同...为什么使用相同的 3 次?
  • @BasileStarynkevitch 这并没有太大的区别。我改变了它们,没有什么特别的原因。 ;)
猜你喜欢
  • 1970-01-01
  • 2021-10-09
  • 1970-01-01
  • 2020-08-23
  • 2016-03-05
  • 2011-11-05
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
相关资源
最近更新 更多