C++ C++;散列限制

C++ C++;散列限制,c++,hash,probability,C++,Hash,Probability,如中所述 a的h(a)=h(b)概率=b应接近 1.0/std::numeric\u limits::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;

如中所述

a的
h(a)=h(b)
概率=b
应接近
1.0/std::numeric\u limits::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));
  }
};
因此,我的问题被简化为计算
p(无公共)*p(n1+n2==n3+n4)
P(无公共)
是特定于用例的(在我的例子中,这种可能性可能很高),但是,
P2
呢?有人帮忙吗


注意:我的问题不是这里其他类似问题的重复,因为我问的是我提出的散列函数的统计特性,而不是如何实现它。

它没有填满该特性,因为最终的概率计算与散列概率无关。它必须独立计算,在我的理解中,你不能对它应用任何代数性质

四个不同的数字给出相同的散列的概率(我也是这么做的)是(
n
是每个数字的域):

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


注意我的第一句话错了。由于模运算溢出,如果散列函数本身是相关的,则散列的总和是均匀分布的。

:if
h(a)
的可能重复项沿std::size\t均匀分布,
h(b)
也沿
std::size\t
均匀分布,然后
h(a)+h(b)
由于翻转,也沿std::size\u t均匀分布。“没有滚动,你是对的。”MooingDuck有趣的东西。谢谢
 P1 = P(n1 + n2 == n1 + n3) = P(n2 == n3) = 0 // Because n2 != n3
 P2 = P(n1 + n2 == n3 + n4) = ? // n1 != n3 and n2 != n4
 (2 * n^2 + 4 * n + 3) / (3 * (n + 1) ^ 3)