7
回答
什么是hash算法,百度百科看不懂,能通俗点吗
华为云实践训练营,热门技术免费实践!>>>   

什么是hash算法,百度百科看不懂,能通俗点吗

举报
大溪
发帖于3个月前 7回/429阅

首先,hashCode就是一种查找的索引值。就好比一个数组,你用数组下标来查找你的数组元素,同样,hashCode来查找hashTable中的存储元素。当然,作为散列方式的查找和存储,要比数组这种线性数据结构复杂的多

从结果来说,每个人指纹是不一样的,所以指纹能确定一个人是谁,但并没有那个人本身的身高体重性格爱好的信息。hash结果的功能就像指纹,方便快速区分不同数据,同时也能知道为什么hash是不可逆的。 明白用途后,就是实现了,如何提取出不同数据的指纹,但是又要保证不同数据的指纹尽量不同呢?这个算法就是hash算法。

把网址A,转换成数字1。网址B,转换成数字2。
一个网址X,转换成数字N,根据数字N作为下标,就可以快速地查找出网址X的信息。
这个转换的过程就是哈希算法。
哈希算法并不是一种特定的算法,只要能完成这种转换的算法都是哈希算法。但是评定一个算法是否是好的哈希算法,要根据算法的离散度和冲突概率来评定。

--- 共有 1 条评论 ---
大溪转为1,转为2 转为N,是不是可以认为1,2,...N为地址?? 3个月前 回复

hash算法.可以认为是将

    一个数据集合中的部分(或全部)特征

    进行

    有特定规律的处理后(算法的核心要求之一是输入差之毫厘,输出谬之千里)

    得出的值符合

    分布在一定区间中的且在统计学上符合均匀分布(这也是算法的核心要求之一)

    的不可逆算法.

好吧其实说的并不通俗.只是列举几个我记得的特征而已.

--- 共有 5 条评论 ---
Shabby-滔 回复 @大溪 : 数组是线性结构,但是也可以用来实现树结构.典型的堆排就基于数组. 3个月前 回复
大溪 回复 @Shabby-滔 : 正解了。hashCode就是一种查找的索引值。就好比一个数组,你用数组下标来查找你的数组元素,同样,hashCode来查找hashTable中的存储元素。当然,作为散列方式的查找和存储,要比数组这种线性数据结构复杂的多 3个月前 回复
Shabby-滔 回复 @大溪 : hash算法还可以用于数据校对,数据加密.等用途,所以一般而言,hash算法不是算出数据存储地址. 3个月前 回复
Shabby-滔 回复 @大溪 : 你说的已经是hash算法的具体应用了.如果将hash算法用于数据存储,一般而已都是用hash算法算出数组索引.(在高级语言中,一般都用数组来做储存载体,by the way,你可以参考一下java的hashmap的实现,osc上有这部分的源码分析) 3个月前 回复
大溪hash算法得出的结果是不是就是对应的存储地址? 3个月前 回复

 首先介绍一下什么是哈希表。同线性表、树一样,哈希表也是一种数据结构,理想情况下可以不需要任何比较,一次存取便能得到所查记录。所以它的优点就是查找特定记录的速度快。因为哈希表是基于数组的,所以创建后就难于扩展,而且不利于遍历数据。

  下面是哈希表的C实现:

/* 哈希表的C实现
  查找使用的方法是“除留余数法”,解决冲突使用的方法是“链地址法”。
*/
#include<stdio.h>
#include<malloc.h> //malloc 
#include<string.h> //memset
#define FALSE 0
#define TRUE 1
typedef int STATUS;
//定义哈希表和基本数据节点
typedef struct _NODE
{
    int data;
    struct _NODE* next;
}NODE;

typedef struct _HASH_TABLE
{
    NODE* value[10];
}HASH_TABLE;
//创建哈希表
HASH_TABLE* create_hash_table()
{
    HASH_TABLE* pHashTbl = (HASH_TABLE*)malloc(sizeof(HASH_TABLE));
    memset(pHashTbl, 0, sizeof(HASH_TABLE));
    return pHashTbl;
}
//在哈希表中查找数据
NODE* find_data_in_hash(HASH_TABLE* pHashTbl, int data)
{
    NODE* pNode;
    if(NULL ==  pHashTbl)
        return NULL;

    if(NULL == (pNode = pHashTbl->value[data % 10]))
        return NULL;

    while(pNode){
        if(data == pNode->data)
            return pNode;
        pNode = pNode->next;
    }
    return NULL;
}
//在哈希表中插入数据
STATUS insert_data_into_hash(HASH_TABLE* pHashTbl, int data)
{
    NODE* pNode;
    if(NULL == pHashTbl)
        return FALSE;

    if(NULL == pHashTbl->value[data % 10]){
        pNode = (NODE*)malloc(sizeof(NODE));
        memset(pNode, 0, sizeof(NODE));
        pNode->data = data;
        pHashTbl->value[data % 10] = pNode;
        return TRUE;
    }

    if(NULL != find_data_in_hash(pHashTbl, data))
        return FALSE;

    pNode = pHashTbl->value[data % 10];
    while(NULL != pNode->next)
        pNode = pNode->next;

    pNode->next = (NODE*)malloc(sizeof(NODE));
    memset(pNode->next, 0, sizeof(NODE));
    pNode->next->data = data;
    return TRUE;
}
//从哈希表中删除数据
STATUS delete_data_from_hash(HASH_TABLE* pHashTbl, int data)
{
    NODE* pHead;
    NODE* pNode;
    if(NULL == pHashTbl || NULL == pHashTbl->value[data % 10])
        return FALSE;

    if(NULL == (pNode = find_data_in_hash(pHashTbl, data)))
        return FALSE;

    if(pNode == pHashTbl->value[data % 10]){
        pHashTbl->value[data % 10] = pNode->next;
        free(pNode);
        return TRUE;
    }

    pHead = pHashTbl->value[data % 10];
    while(pNode != pHead ->next)
        pHead = pHead->next;
    pHead->next = pNode->next;

}
 void main()
{
    HASH_TABLE* hashtable=create_hash_table();
    insert_data_into_hash(hashtable,1);
    //insert_data_into_hash(hashtable,4);
    insert_data_into_hash(hashtable,11);
    insert_data_into_hash(hashtable,21);
    NODE* node1=find_data_in_hash(hashtable,11);
    NODE* node2=find_data_in_hash(hashtable,21);
    printf("hashtable 1 : %d \n",hashtable->value[1]->data);
    if(hashtable->value[2]==NULL) printf("hashtable 2 is null\n");
    printf("hashtable 1 : %d \n",node1->data);
    printf("hashtable 1 : %d \n",node2->data);
    delete_data_from_hash(hashtable,21);
        NODE* node3=find_data_in_hash(hashtable,21);
    if(node3==NULL) printf("21 is cancel\n");
    else printf("hashtable 1 : %d \n",node3->data);
    

}

 

顶部