[译]C语言实现一个简易的Hash table

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[译]C语言实现一个简易的Hash table相关的知识,希望对你有一定的参考价值。

技术分享图片

上一章我们解释了Hash table中最重要的hash函数,并用伪代码和C语言实现了一个我们自己的hash函数hash函数碰撞是无法避免的,当发生碰撞时我们改如何有效的处理呢?这章我们就来讲解下。

处理碰撞

hash函数中将无限大的输入映射到有限的输出中,当不同的输入映射到相同的输出时,就会发生碰撞,每个的hash表都会采用不同的方法来处理碰撞

我们的哈希表将使用一种称为开放地址的双重哈希的技术来处理冲突。双重哈希使用两个散列函数来计算在发生碰撞后存储记录的索引。

双重哈希

i发生碰撞后我们使用如下方式来获取索引:

index = hash_a(string) + i * hash_b(string) % num_buckets

当没有发生碰撞时,i=0,所以索引就是hash_a的值,发生碰撞后,hash_a的结果就需要经过一次hash_b的处理。

hash_b可能会返回0,将第二项减少到0,这就导致hash表会将多个记录插入到同一个bucket中,我们可以在hash_b的结果后加1来处理这种情况,确保它永远不会为0

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


原文地址:https://github.com/jamesroutley/write-a-hash-table/tree/master/05-methods


以上是关于[译]C语言实现一个简易的Hash table的主要内容,如果未能解决你的问题,请参考以下文章

[译]C语言实现一个简易的Hash table

[译]C语言实现一个简易的Hash table

[译]C语言实现一个简易的Hash table

C语言实现简易版 扫雷 步骤及代码

C语言实现简易版 扫雷 步骤及代码

C 语言构造hash table 解 LC majority element问题