




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、哈希算法简介哈希算法简介目录1哈希算法概念22哈希函数33冲突的解决方法 34哈希算法应用 4关键词:算法、哈希、c 语言摘要:哈希算法在软件开发和 Linux内核中多次被使用,由此可以见哈希算法的实用性和重要性。本 文介绍了哈希算法的原理和应用,并给出了简略的代码实现,以便读者理解。第1页共7页哈希算法简介1哈希算法概念哈希(hash散列,音译为哈希)算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二 进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字 母,随后的哈希算法都将产生不同的值。要找到散列为同一个值的两个不同的
2、输入,在计算上是不可能的,所 以数据的哈希值可以检验数据的完整性。哈希表是根据设定的哈希函数H(key)和处理冲突方法将一组关键字映象到一个有限的地址区间上,并以关键字在地址区间中的项作为记录在表中的存储位置,这种表称为哈希表,所得存储位置称为哈希地址。作为线性数据结构与表格和队列等相比,哈希表无疑是查找速度比较快的一种。查找一般是对项的摸个部分(及数据成员)进行,这部分称为键(key)。例如,项可以由字符串作为键,附带一些数据成员。理想的哈希表数据结构只不过是一个包含一些项的具有固定大小的数组。通常的习惯是让项从 0到TableSize-1之间变化。将每个键映射到 0到TableSize-1
3、这个范围中的某个数,并且将其放到适当的单元中,这个映射就称为散列函数(hashfunciton )。如右图,john被散列到3, phil被散列到4, dave被散列到6,mary被散列到7.这是哈希的基本思想。剩下的问题则是要选择一个函数,决 定当两个键散列到同一个值的时候(称为冲突),应该做什么。第4页共7页2哈希函数通常,键是字符串,一种选择方法是把字符串中字符ASCII码值加起来。unsigned int hash( const char * key, int tableSize)(unsigned int hastV al = 0;for( int i = 0; i < str
4、len(key); i+)hashVal += key i ;return hashVal % tableSize;通过对ASCII码总和取tableSize的余数,来确定哈希值。这是个简单的示例,实现起来很简单而且能够很快地算出答案。不过,如果表很大,则函数不会很好地分配键。由于 ASCII字符的值最多为127,如果输入的key,都是长度比较小的字符串,那么返回的键值(哈希值)就会集中在哈希表的头部,这样就会分配不均匀。好的哈希算法这部分会非常复杂,这里仅仅做个介绍。在下面的哈希算法应用中会介绍linux内核如何使用哈希算法管理网络设备结构。3冲突的解决方法在使用哈希算法时,除了哈希函数之外
5、,还需要注意的是冲突(两个键散列到同一个值的时候)的处理。常用的处理方式有分离链接法、线性探测、平方探测。由于线性探测和平方探测涉及到一些数学问题,本文就介绍分离链接法。分离链接法也比较简单,其做法为将散列到同一个值的所有元素保留到一个链表中。图分离链接散列表4哈希算法应用4哈希算法应用如上图所示,所有哈希表项对应一个链表,这样只要将冲突项放入链表就行,当查找时先找到 链表,然后在比较链表上项的键,得到想要的项,这个方法比较容易实现,但是会增加查找的耗时, 原来只需计算哈希值,现在增加了对链表项的比较功能。return Wevindexiteifindem & (1<<NE
6、TDE:V_HASHBITS)-1);下面看看linux内核中网络设备,是怎么样通过设备名获取相应设备的net_device结构体。在这个过程中,使用了哈希算法,并且使用了分离链接法解决冲突的问题。使用哈希算法可以提高查询 速度,如果使用链表,查询时需要逐一比较,效率低下。struct net_device *d6V_gt_by_name(const char *namejstruct hlist_nodBhl»sl_for_edch(pj Jev_name_liashCname struct net_device *de v=hlist_entry(p, struct net_de
7、vicEj name_hlisti;if(! strncmptdev- >name, narmCj IFNAMSIZ) return dev;return NULL;#define NETDEV_HASHBITS Sstatic struct hlist_head dev_name_headl<<FJETDEV_HASHBITS;static struct hlist_head dev_indeK_heHadi<<NETDEV_HASHBITSjstatic inline struct hlisthead *dfiV n&ITkB hOSh(const c
8、har "name)< 一 unsigned hash = full_nam合strnlenCnamCj IFNAMSIZ)jreturn 心廿专专& (1<<NETDEV_HASHBITS)-l)jstatic inline struct hist_head 4dev_index_hash(int jfindeM) - -/* Compute the hash for a name string, */ static inline jnsigned int full_n3rn6_hash(const unsigned char *nameJ unsigne
9、d int len)unsigned long hash = init_name_hash(;vihtle (len-hash = partial_namE_ hash(*name + + J hash);return end_name_hash(hash);哈希算法简介/* partial hash update function. Assume roughly 4 bits per character */static inline unsigned longpartial n3Hie_hash(uri5igned long Cj unsigned long preyhash) 一 - return (prevhidsh + (c << 4)+ (c >> 4) * 11;dev_name_head为哈希表,保存了所有项的链表头。1 << NETDEV_HASHBITS为表
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新基建考试题及答案
- 广告设计师证书考试信息设计解析题及答案
- 护士试题填空题及答案
- 宣传诚信面试题及答案
- 广告设计师必考内容解析试题及答案
- 广告设计创意批评与改进试题及答案
- 2024年助理广告师考试注意细节试题及答案
- 初中安徽文综试题及答案
- 2024年纺织考试的心理准备技巧试题及答案
- 广告设计师整合营销理论试题及答案
- 《地理高考备考讲座》课件
- 2024-2030年全球及中国雅思练习和考试平台行业发展规模及未来前景预测报告
- TSG 07-2019电梯安装修理维护质量保证手册程序文件制度文件表单一整套
- 2025深圳劳动合同下载
- 《风电施工流程》课件
- 水处理设备日常维护方案
- 河南省“极飞杯”无人机应用技术技能大赛-无人机植保应用-技术文件
- 2024年上海市交大附中高三语文期中考试作文题目解析及范文:松弛感
- 【碳足迹报告】新乡市锦源化工对位脂产品碳足迹报告
- 部编版历史九年级上册第1课-古代埃及【课件】a
- 盾构法施工毕业设计论文
评论
0/150
提交评论