在C语言中创建哈希表

在C语言中创建哈希表,c,hashtable,C,Hashtable,我是哈希表概念的新手。我试图创建一个非常简单的哈希表来理解这个概念。我已经了解了如何创建基本的哈希函数来进行哈希运算。但是,我不明白如何将它链接到表的其余部分。我对如何开始创建表、创建查找函数、删除表中的条目等感到困惑 散列函数看起来像这样 但是我不了解其他部分,比如如何创建表格、查找等等 谁能帮帮我吗。非常感谢您的帮助。与其告诉您如何编写代码,不如告诉您要学习的领域名称: 关于这个问题的大多数书籍都会给你一个如何创建哈希表的例子。我的建议是,从一种比C更简单的语言开始,了解这个概念,然后再回到

我是哈希表概念的新手。我试图创建一个非常简单的哈希表来理解这个概念。我已经了解了如何创建基本的哈希函数来进行哈希运算。但是,我不明白如何将它链接到表的其余部分。我对如何开始创建表、创建查找函数、删除表中的条目等感到困惑

散列函数看起来像这样

但是我不了解其他部分,比如如何创建表格、查找等等


谁能帮帮我吗。非常感谢您的帮助。

与其告诉您如何编写代码,不如告诉您要学习的领域名称:

关于这个问题的大多数书籍都会给你一个如何创建哈希表的例子。我的建议是,从一种比C更简单的语言开始,了解这个概念,然后再回到C。非常简单地说,将数据拆分成更小的存储单元(称为存储桶)就可以使用哈希表。这些内部存储单元由索引访问,索引是存储在存储桶中的值的哈希代码。注意数值中的s。您需要能够在一个bucket中存储多个值以支持哈希代码冲突

因此,我们需要从哈希表中执行两个基本操作

包含-要执行包含检查,您需要计算哈希值以查找数据应位于的存储桶。一旦找到了正确的存储桶,您需要检查其中的每一项是否相等,无论您选择如何实现这一点。 添加-向表中添加新项需要类似于Contains中的检查,以防止添加任何项两次。 移除-你可以猜到。以与容器相同的方式查找项目,并将其从桶中移除。 也就是说,您需要实现bucket。明明说你需要一份清单。对于第一层,您需要一些支持索引访问的集合。因为您使用的是C语言,所以简单的数组是一个不错的选择。我建议您不要对可以执行的bucket使用整数的完整范围,但这将使其更难理解和调试。只需应用一个模运算就可以适当地缩小哈希代码的范围。对于第二部分,我建议使用链表之类的方法来支持动态增长

因此,您可以根据数组索引查找链表,然后处理链表中的每个项目以找到正确的项目。这也说明了哈希冲突降低哈希表效率的原因。如果没有散列冲突,则只需一个测试即可找到该项,即时间常数。如果存在哈希冲突,则需要检查多个值

哈希冲突是返回相同哈希代码的两个不同值


希望这能给你一个如何开始的想法。不要听任何人的。C是一种很棒的入门语言。

基本概念很简单:

使用非常大的数组来存储数据 使用哈希函数为数组编制索引 你会遇到冲突,所以找出一种机制来处理这些冲突,链表可能是最简单的 因此,当您想要写入数据时:index=hash_函数;数组[索引]=数据。类似于阅读


阅读更多有关哈希表的内容后,您将了解其余内容

这个问题太宽泛了,无法给出一个好的答案,但您可能希望了解如何实现单链接列表。哈希表中的每个bucket都可以使用单链表实现,因此,一旦你完成了这项工作,你就可以通过使用一个常量哈希函数来测试你的哈希表,也就是说,它总是产生相同的哈希和,这样所有东西都会在同一个桶中结束。你可以在另一个问题中找到一些实现示例谢谢你的回答。我实际上已经理解了哈希表的概念。我知道它是怎么工作的。我现在只需要一个简单的例子,说明如何创建哈希表。不过还是要谢谢你的帮助:大多数书都有代码示例……谢谢你的帮助。它使这个概念更加清晰:我现在将尝试实施它。谢谢你的帮助
unsigned int hash(hash_table_t *hashtable, char *str)
{
    unsigned int hashval;

    /* we start our hash out at 0 */
    hashval = 0;

    /* for each character, we multiply the old hash by 31 and add the current
     * character.  Remember that shifting a number left is equivalent to 
     * multiplying it by 2 raised to the number of places shifted.  So we 
     * are in effect multiplying hashval by 32 and then subtracting hashval.  
     * Why do we do this?  Because shifting and subtraction are much more 
     * efficient operations than multiplication.
     */
    for(; *str != '\0'; str++) hashval = *str + (hashval << 5) - hashval;

    /* we then return the hash value mod the hashtable size so that it will
     * fit into the necessary range
     */
    return hashval % hashtable->size;
}