C 哈希限制
C++ Hash Restriction
本文关键字:哈希限 更新时间:2023-10-16
cppreference.com
中所述
a!=b
的h(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 != n2
为0
。 - 由于总和是有效的,
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倍,但仍然可以忽略不计(。这必须乘以两对完全不同的数字的概率。
注意我在第一个句子中错了。由于模块化算术溢出,如果哈希函数本身为。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 使用Qt C++计算类似Git的SHA1哈希
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 用C++将哈希表写入文件并从文件中恢复
- c++找不到具有相同哈希的无序集合元素
- 哈希文件递归并保存到矢量Cryptopp中
- 对 pair<pair<int,int>pair<int,int unordered_map进行哈希处理>>
- 直接在 unordered_map 的方法中使用哈希,而不是生成哈希的用户定义对象
- 如何为字符串生成唯一但一致的 N 位哈希(小于 64 位)?
- 使用对象的基类部分模板专用化对对象进行哈希处理::哈希
- boost::包含提升单元的元组的哈希值
- 使用 Key 对 C++ 中的哈希映射进行排序. 无法排序
- C++中的并发哈希表
- 哈希映射使用 nullptr c++ 初始化节点的动态数组
- 在具有开放寻址的哈希表中插入节点 [优化逻辑]
- 与C++哈希表的基础知识混淆
- 如何为位集找到/实现一个好的哈希函数
- 对于短字符串来说,这是一个很好的哈希函数吗?
- 调整大小和复制哈希表数组中的元素