Hash初步
2016-04-25 16:03
281 查看
Hash主要用于信息安全领域中加密算法,它把一些不同长度的信息转化成杂乱的128位的编码,这些编码值叫做HASH值. 也可以说,Hash就是找到一种数据内容和数据存放地址之间的映射关系。
数组的特点是:寻址容易,插入和删除困难;而链表的特点是:寻址困难,插入和删除容易。那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表,哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法——拉链法,我们可以理解为“链表的数组”,如图:
![](http://img.blog.csdn.net/20160424125344824?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
先来最简单的hash算法,用数组实现,没有解决冲突问题:
已经加上注释:
数组的特点是:寻址容易,插入和删除困难;而链表的特点是:寻址困难,插入和删除容易。那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表,哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法——拉链法,我们可以理解为“链表的数组”,如图:
先来最简单的hash算法,用数组实现,没有解决冲突问题:
已经加上注释:
#include <stdio.h> #define N 6 #define M 6 //N hash表的大小 M 插入的个数 typedef int datatype;//定义数据类型 typedef struct { datatype key; }Hretype;//结构体类型 int LHashsearch(Hretype HT , datatype k)//传表和KEY值 { int addr,i=0; addr = k % N;//最简单的哈希函数 while(i<N && HT[addr].key != -1 && HT[addr].key != k)//如果表是空的,或者其key值的相同的 { i++; addr = (addr+1)%N;//寻找下一个数组元素 } if(i == N) return -1; //表溢出 else return addr;//返回地址 } int LHinsert(Hretype HT , Hretype R)//插入表 { int addr; addr = LHashsearch(HT, R.key);//找地址 if(addr==-1 || HT[addr].key == R.key)//如果表满了 ,或者元素冲突 { return 1; } else { HT[addr] = R;//否则,插入 return 0; } } int main() { int i; Hretype R[M];//要插入的数 Hretype HT ;//hash表 for( i=0;i<N;i++) HT[i].key = -1; printf("please input %d numbers:",M); for(i=0;i<M;i++) scanf("%d",&R[i].key); for(i=0;i<M;i++) { int value = LHinsert(HT,R[i]); if(value) printf("表溢出\n"); else { printf("插入成功\n"); } } for(i=0;i<M;i++) { printf("i=%d\n",HT[i].key); } return 0; }
相关文章推荐
- 如何获取Android RecyclerView滑动的距离
- 手把手教会popupWindow从下往上弹出效果的实现
- 解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
- json型数据,logstash邮件报警配置案例
- Rsync使用
- 合法的邮箱测试用例
- IOS开发之----使用ZipArchive解压缩文件
- Loadrunner随机生成15位数字串
- 获取ListView当前滚动的距离(高度)
- dialog and activity style
- 前端js与css兼容性问题
- display:inline-block的间距空白问题
- PHP 函数
- ubuntu下搭建samba服务器
- Intellij IDEA 创建Web项目并在Tomcat中部署运行
- HDU - 5673(catalan数的应用)
- opencv3 鼠标响应函数画矩形
- <OJ_Sicily>LIS最长上升子序列
- ionic入门教程第十一课-简要说明ion-list、ion-item完成列表页ion-infinite-scroll上拉加载ion-refresher下拉刷新
- synchronized关键字的正确用法