上一章咱们解释了Hash table
中最重要的hash函数
,并用伪代码和C语言实现了一个咱们本身的hash函数
,hash函数
中碰撞
是没法避免的,当发生碰撞
时咱们改如何有效的处理呢?这章咱们就来说解下。算法
hash函数
中将无限大的输入映射到有限的输出中,当不一样的输入映射到相同的输出时,就会发生碰撞
,每一个的hash表
都会采用不一样的方法来处理碰撞
。函数
咱们的哈希表将使用一种称为开放地址的双重哈希的技术来处理冲突。双重哈希使用两个散列函数来计算在发生碰撞
后存储记录的索引。.net
当i
发生碰撞
后咱们使用以下方式来获取索引:3d
index = hash_a(string) + i * hash_b(string) % num_buckets
当没有发生碰撞
时,i=0
,因此索引就是hash_a
的值,发生碰撞
后,hash_a
的结果就须要通过一次hash_b
的处理。code
hash_b
可能会返回0
,将第二项减小到0
,这就致使hash表
会将多个记录插入到同一个bucket
中,咱们能够在hash_b
的结果后加1
来处理这种状况,确保它永远不会为0
:blog
index = (hash_a(string) + i * (hash_b(string) + 1)) % num_buckets
// hash_table.c static int ht_get_hash(const char* s, const int num_buckets, const int attempt) { const int hash_a = ht_hash(s, HT_PRIME_1, num_buckets); const int hash_b = ht_hash(s, HT_PRIME_2, num_buckets); return (hash_a + (attempt * (hash_b + 1))) % num_buckets; }
上一章:hash函数 下一章:完成Hash表API索引