哈希表:当第二个哈希函数返回表大小的倍数时,使用双哈希
Hashtables: Double hashing when the second hash function returns a multiple of the table size
我正在用c++实现一个HashTable,通过双哈希使用开放寻址。
我理解双哈希的基本原理是:
indexInProbingSequence = (originalIndex + i * hashFunction2(key)) % tableSize
我认为我已经正确地实现了这一部分。这是一个家庭作业,这门课的规定是我不能对任何特定的代码征求意见,所以在这一点上你们要相信我。
似乎给我带来问题的是,偶尔,一些键,当受到第二个哈希函数时,返回的值是(主要)表大小的倍数。在这些情况下,探测序列中的所有索引都是相同的。例如:
originalIndex = 32
hashFunction2(key) = 3035446
tableSize = 211
探测序列为:
(32 + 1 * 3035446) % 211 == 32
(32 + 2 * 3035446) % 211 == 32
等等
我错过了什么?
我认为您没有错过任何内容,特别是当hashFunction2(key) == 0
.
用(hashFunction2(key) % (tableSize - 1) + 1)
代替hashFunction2(key)
。最理想的情况是,步幅是环对表大小取模的生成器(这是表示探测最终覆盖整个表的一种时髦方式),或者至少有一个大周期。由于表的大小是素数,所以必须避免0
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 我在C++中使用提升哈希函数将 3 个双精度组合成一个面临冲突的哈希
- C++哈希表中,两个相同的实现,但一个给出错误
- 我可以比朴素哈希表更快地将随机字符串映射到两个类吗?
- 对 32 位整数进行哈希处理比对 3 个 16 位整数的哈希进行按位运算慢?
- 从 2 个 uint64 值中提取诡异哈希 128 位值
- 使用哈希 C++ 查找具有 k 个不同/唯一字符的最长子字符串
- 我如何使用上一个块的哈希链接2个块
- 在几个键的哈希表处搜索
- 如何从 3 个有序整数创建哈希
- 单词计数项目的多个哈希表
- 同时在多个字节上的SDBM哈希
- 对于具有 3 个无符号字符和一个 int 的结构来说,对于unordered_map来说,什么是好的哈希函数?
- 从 2+ 个整数(快速)创建哈希/种子值
- 好的哈希函数,2个整数用于一个特殊的密钥
- 哈希映射适用于X个元素
- C++:第一个非重复字符,使用哈希映射的 O(n) 时间
- 两个成员中任意一个成员的哈希
- 哈希表:当第二个哈希函数返回表大小的倍数时,使用双哈希
- 哈希100个10亿范围内的不同值