c语言hash函数有几种

 我来答
就烦条0o
2018-02-05 · 知道合伙人软件行家
就烦条0o
知道合伙人软件行家
采纳数:33315 获赞数:46488
从事多年系统运维,喜欢编写各种小程序和脚本。

向TA提问 私信TA
展开全部
#include <stdio.h>#include <stdlib.h>//这里我自己设计一个hash算法来快速查找一堆数字中相等的数字,这也许是最接近原理的算法了//一个整数整除27后的来作为hash函数//定义一个保存实际数据的结构体节点struct data_node{    int num;    int count;    struct data_node *next;};//定义一个结构体时hash表的一部分typedef struct{    int key; //余数    struct data_node *p; //链表的头指针} hash_node;#define HASH_SIZE 27int do_hash(int num) //hash表来求余数,这样就可以了{    return num%HASH_SIZE;}//初始化//添加数字//更新数字//删除数字//查找数字hash_node HashTable[HASH_SIZE]; //这里申明一个hashtable的数组//初始化函数,需要做的事将key复制为null,将p指针指向null,返回一个头指针来指向这个hashtablevoid InitHashTable(hash_node *HashTable)
{    //进行参数的校验    for(int i=0;i<HASH_SIZE;i++)
    {
        HashTable[i].key = 0;        HashTable[i].p =NULL;    }
}//保存到这个链表中//如果这个链表是空的话,就作为头指针,如果这个链表不为空,则添加到吧数字添加到末尾int savedata(struct data_node **head,int num)
{    struct data_node *tmp_p = *head;    struct data_node *p = (struct data_node *)malloc(sizeof(struct data_node));    if(p == NULL)        return 0;    if(*head == NULL)
    {
        *head = p;        p->count = 1;        p->num = num;        p->next = NULL;    }    else //如果不为空,则这个时候应该添加到链表末尾    {        while(tmp_p != NULL)//如果存在,则将这个节点的count加1就可以了        {            if(tmp_p->num == num)
            {
                free(p);                ++tmp_p->count ;                return 0;            }            if(tmp_p->next == NULL)                break;            tmp_p = tmp_p->next;        }

        tmp_p->next = p;        p->count =1;        p->num = num;        p->next = NULL;    }    return 0;}//添加数字//将这个数字经过hash求出结果,然后再保存到相应的链表中//返回真或者假就可以了int add_hash(hash_node *HashTable,int num)
{    int mod = do_hash(num);    return savedata(&HashTable[mod].p,num);}int main()
{    int num = 100;    hash_node *H = HashTable;    InitHashTable(H);    add_hash(H,num);    add_hash(H,num);    add_hash(H,3);    add_hash(H,1);    add_hash(H,4);    //在这里我们可以发现一个好的hash函数是多么的重要,如果hash函数不好造成很多冲突的话,效率并不会提高很多的,理想的情况是冲突几乎没有    //这也就是设计hash函数的精髓所在    return 0;}
mafangsan
2018-02-04 · TA获得超过1.2万个赞
知道大有可为答主
回答量:1万
采纳率:71%
帮助的人:2544万
展开全部
hash是可以针对具体问题自己设计的,所以答案是无数种
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式