C 哈希限制

C++ Hash Restriction

本文关键字:哈希限      更新时间:2023-10-16

cppreference.com

中所述

a!=bh(a)==h(b)的概率应接近 1.0/std::numeric_limits<std::size_t>::max()

我想创建一个对 (a, b)的哈希表,其中 (a, b) == (b, a)(无序对(,所以我的哈希函数是:

struct hash_pair {
  template<class T>
  std::size_t operator()(std::pair<T, T> const& p) const
  {
     std::hash<T> h;
     return std::hash<std::size_t>(h(p.first) + h(p.second));
  }
};

假设h(ti)std::hash<std::size_t>满足要求,hash_pair也会满足它吗?

在进一步思考之后:

(一些额外的细节(

  • p.first != p.second通过我的用例的先决条件。
  • T在大多数情况下是std::size_t,其哈希值本身为本身,因此h(n) == n,因此P(n1 == n2)n1 != n20
  • 由于总和是有效的,hash(pair(n1, n2)) == hash(pair(n2, n1))是意图的。

因此,我们只有两对可以不同的情况,当它们只有一个共同的元素,或者没有两个元素时:

 P1 = P(n1 + n2 == n1 + n3) = P(n2 == n3) = 0 // Because n2 != n3
 P2 = P(n1 + n2 == n3 + n4) = ? // n1 != n3 and n2 != n4

因此,我的问题减少到计算P(none_in_common) * P(n1 + n2 == n3 + n4)P(none_in_common)是特定于用例的(在我的情况下,此概率可能很高(,但是P2呢?这里有帮助吗?

注意:我的问题不是这里其他类似问题的重复,因为我询问了我所提出的哈希功能的统计属性,而不是关于如何做的。

它没有完整填写属性,因为最终概率计算与哈希概率无关。它必须独立计算,您在我的理解中不能对其应用任何代数属性。

从我提出的这个问题中,使用更多数学方法的四个不同数字的概率是(n是每个数字的域(:

(:
 (2 * n^2 + 4 * n + 3) / (3 * (n + 1) ^ 3)

给出了大约3.61e-20,它是完美的(比单个数字最差的1.5倍,但仍然可以忽略不计(。这必须乘以两对完全不同的数字的概率。

注意我在第一个句子中错了。由于模块化算术溢出,如果哈希函数本身为。