【问题标题】:Good Hash function with 2 integer for a special key具有 2 个整数的特殊键的良好哈希函数
【发布时间】:2012-09-27 16:41:37
【问题描述】:

我正在尝试确定 map<double, double> 类型的密钥。但问题是我想要的密钥将由一对 2 数字生成。有没有好的函数可以为 (0, 1), (2, 3), (4, 2) (0, 2) 等对生成这样的密钥。

【问题讨论】:

  • 看到这个类似的问题:stackoverflow.com/questions/2634690/…
  • 为什么不直接使用std::pair<int, int> 作为您的密钥类型?
  • 是的,std::map<:pair int>, int> 会有效。

标签: c++ hash hashmap


【解决方案1】:

选择 N'ary 数值系统,其中 N 是对中数字的最大可能值。

像这样:

hash(a, b) = a + b * N

然后

a = hash(a, b) % N
b = hash(a, b) / N

这将保证每对 (a, b) 都有自己唯一的哈希 (a, b)。十进制数字也会发生同样的事情:想象从 0(我们将它们写为 00、01、02、...)到 99(包括在内)的所有数字都是你的对 ab。然后,hash(a, b) = a * 10 + b,反之亦然,要获得第一个数字,您必须将该数字除以 10,第二个 - 取模 10。

为什么我们不能选择任何 N,可能小于 a/b 的最大值?答案是:避免碰撞。
如果您选择任何数字并且它恰好小于您的最大数字,则很可能由不同的数字对提供相同的哈希函数。例如,如果您为 (10, 10) 和 (0, 11) 对选择 N = 10,则它们的哈希值都将等于 110,这在这种情况下对您不利。

【讨论】:

  • 所以像这样:pair (1, 3) = hash(1, 3) = 1 + (3*181.312)
  • 如果 181.312 == 181312 == 181,000 加 312,那是你的 N,那么是的,这是正确的。 :)
  • 为什么我需要跟踪N,我不能使用任意数字吗?但是,我会将每个条目乘以相同的数字
【解决方案2】:

理想情况下,您应该将KeyValuePair&lt;int, int&gt; 作为您的密钥。我不认为编写比这更多的代码会有帮助。如果由于某种原因您不能拥有它,那么散列这对以提供单个密钥取决于您要实现的目标。如果散列适用于像Dictionary 这样的散列结构,那么您必须平衡冲突率和散列速度。要获得完全没有冲突的完美哈希,将更加耗时。类似地,最快的散列算法相对会发生更多的冲突。找到完美的平衡是这里的关键。 您还应该考虑您的有效散列可以有多大,以及散列输出是否应该是可逆的以返回原始输入。通常应该优先考虑加速配对/散列/映射而不是最小化冲突概率(一个好的散列算法将有更少的冲突机会)。要获得完美的哈希值,您可以查看 this thread 以获得大量选项..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    相关资源
    最近更新 更多