欢迎来到装配图网! | 帮助中心 装配图网zhuangpeitu.com!
装配图网
ImageVerifierCode 换一换
首页 装配图网 > 资源分类 > DOCX文档下载
 

哈希算法介绍

  • 资源ID:170290468       资源大小:37.98KB        全文页数:9页
  • 资源格式: DOCX        下载积分:15积分
快捷下载 游客一键下载
会员登录下载
微信登录下载
三方登录下载: 微信开放平台登录 支付宝登录   QQ登录   微博登录  
二维码
微信扫一扫登录
下载资源需要15积分
邮箱/手机:
温馨提示:
用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

哈希算法介绍

哈希算法简介一哈希算法简介目录1哈希算法概念22哈希函数33冲突的解决方法34哈希算法应用4关键词:算法、哈希、C语言摘要:哈希算法在软件开发和Linux内核中多次被使用,由此可以见哈希算法的实用性和重要性。本 文介绍了哈希算法的原理和应用,并给出了简略的代码实现,以便读者理解。1哈希算法概念哈希(hash散列,音译为哈希)算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二 进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字 母,随后的哈希算法都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所 以数据的哈希值可以检验数据的完整性。哈希表是根据设定的哈希函数H(key)和处理冲突方法将一组关键字映象到一个有限的地址区间上,并以 关键字在地址区间中的项作为记录在表中的存储位置,这种表称为哈希表,所得存储位置称为哈希地址。作 为线性数据结构与表格和队列等相比,哈希表无疑是查找速度比较快的一种。查找一般是对项的摸个部分(及数据成员)进行,这部分称为键key)。例如,项可以由字符串作为键, 附带一些数据成员。理想的哈希表数据结构只不过是一个包含一些项的具有固定大小的数组。6 |davt 27500 '17 mary 2H2OO-通常的习惯是让项从0到TableSize-1之间变化。将每个键映射到0到TableSize-1这个范围中的某个数, 并且将其放到适当的单元中,这个映射就称为散列函数(hash funciton)。如右图,john被散列到3, phil被散列到4, dave被散列到6, mary被散列到7.这是哈希的基本思想。剩下的问题则是要选择一个函数,决 定当两个键散列到同一个值的时候(称为冲突),应该做什么。圈5】-个理想的敬列授2哈希函数通常,键是字符串,一种选择方法是把字符串中字符ASCII码值加起来。unsigned int hash( const char * key, int tableSize)unsigned int hastVal = 0;for( int i = 0; i < strlen(key); i+)hashVal += key i ;return hashVal % tableSize;通过对ASCII码总和取tableSize的余数,来确定哈希值。这是个简单的示例,实现起来很简单而且能够很快地算出答案。不过,如果表很大,则函数不 会很好地分配键。由于ASCII字符的值最多为127,如果输入的key,都是长度比较小的字符串,那 么返回的键值(哈希值)就会集中在哈希表的头部,这样就会分配不均匀。好的哈希算法这部分会 非常复杂,这里仅仅做个介绍。在下面的哈希算法应用中会介绍linux内核如何使用哈希算法管理网 络设备结构。3冲突的解决方法在使用哈希算法时,除了哈希函数之外,还需要注意的是冲突(两个键散列到同一个值的时候) 的处理。常用的处理方式有分离链接法、线性探测、平方探测。由于线性探测和平方探测涉及到一些数 学问题,本文就介绍分离链接法。分离链接法也比较简单,其做法为将散列到同一个值的所有元素保留到一个链表中。匚匚目3旨-ia 5-6分离链接散列表如上图所示,所有哈希表项对应一个链表,这样只要将冲突项放入链表就行,当查找时先找到 链表,然后在比较链表上项的键,得到想要的项,这个方法比较容易实现,但是会增加查找的耗时, 原来只需计算哈希值,现在增加了对链表项的比较功能。4哈希算法应用下面看看linux内核中网络设备,是怎么样通过设备名获取相应设备的net_device结构体。在这 个过程中,使用了哈希算法,并且使用了分离链接法解决冲突的问题。使用哈希算法可以提高查询 速度,如果使用链表,查询时需要逐一比较,效率低下。struct net_device *_ _dev_get_by_n am e(const char *name) - -struct hlist_nodehlist_for_each(pj dev_name_ha5h(name) struct net_device +dev =hlisentryfp struct net_devicej nairie_hlist);if(! strncmp(dev- >namej namej IFNAMSIZ) return dev;return NULL;#define NETDEV_HASHBITS Sstatic struct hlist_head dev_name_headl<<NETDEV_HASHBITS;static struct hlist_head dev_indeH_headl<<NETDEV_HASHBITS;static inline struct hlist_head *d6V_Fl出Tie.hSl合h(ucinst char *name) unsigned hash = full-name-hashtname strnlen(namej IFNAMSIZ); return &jt/eu_name_hc&d_hash & (1<<NETDEV_HASHBITS)-1);static inline struct hlist_head * dev_index_hash(int ifindew)returnu_index_head_ifindeh 8; (1<<NETDEV_HASHBITS)-1);卜严 Compute the hash for a name string. */static inline unsigned intfull_naiTl6_hSlSh(const unsigned char namej unsigned int len) _ _ unsigned long hash = init_name_hash();while (len-)hash = partial_name_ha5h(:+:name+J hash);return end_name_hash(ha5h);第4页共7页严 partial hash update function. Assume roughly 4 bits per characterstatic inline unsigned long partial_name_hash(unsigned long c, unsigned long prevhash) return (prevhash + (c << 4)+ (c >> 4) * 11;dev_name_head为哈希表,保存了所有项的链表头。1 << NETDEV_HASHBITS 为表的大小。full_name_hash为哈希函数,其主要目的是为了分布均匀避免冲突,这样可以提高查找效率。 这个应用比较简单,但是清晰的展现哈希算法的架构,而且容易理解。哈希算法应用很多场景,比如管理组播MAC地址,文件系统,数据库,数据校验等等。有兴趣可以深入研究,可以拓宽编程思路。

注意事项

本文(哈希算法介绍)为本站会员(ba****u)主动上传,装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知装配图网(点击联系客服),我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!