哈希算法介绍

哈希算法简介

目录
决策支持系统
1哈希算法概念    2
2哈希函数    3
3冲突的解决方法    3
4哈希算法应用    4

关键词:
算法、哈希、c语言
  要:
哈希算法在软件开发和Linux内核中多次被使用,由此可以见哈希算法的实用性和重要性。本文介绍了哈希算法的原理和应用,并给出了简略的代码实现,以便读者理解。
1哈希算法概念
哈希(hash 散列,音译为哈希)算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。
哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希算法都将产生不同的值。要到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。
哈希表是根据设定的哈希函数H(key)和处理冲突方法将一组关键字映象到一个有限的地址区间上,并以关键字在地址区间中的项作为记录在表中的存储位置,这种表称为哈希表,所得存储位置称为哈希地址。作为线性数据结构与表格和队列等相比,哈希表无疑是查速度比较快的一种。
企业家天地杂志社查一般是对项的摸个部分(及数据成员)进行,这部分称为键(key)。例如,项可以由
字符串作为键,附带一些数据成员。
    理想的哈希表数据结构只不过是一个包含一些项的具有固定大小的数组。
    通常的习惯是让项从0青山事件 TableSize-1之间变化。
    将每个键映射到0TableSize-1 这个范围中的某个数 ,并且将其放到适当的单元中,这个映射就称为散列函数(hash funciton)。
如右图,john被散列到3phil被散列到4dave 被散列到6maryedas被散列到7.
这是哈希的基本思想。剩下的问题则是要选择一个函数,决定当两个键散列到同一个值的时候(称为冲突),应该做什么。

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冲突的解决方法
临猗论坛在使用哈希算法时,除了哈希函数之外,还需要注意的是冲突(两个键散列到同一个值的时候)的处理。
常用的处理方式有分离链接法、线性探测、平方探测。由于线性探测和平方探测涉及到一些数学问题,本文就介绍分离链接法。
分离链接法也比较简单,其做法为将散列到同一个值的所有元素保留到一个链表中。
如上图所示,所有哈希表项对应一个链表,这样只要将冲突项放入链表就行,当查时先到链表,然后在比较链表上项的键,得到想要的项,这个方法比较容易实现,但是会增加查的耗时,原来只需计算哈希值,现在增加了对链表项的比较功能。
4哈希算法应用
下面看看linux内核中网络设备,是怎么样通过设备名获取相应设备的net_device结构体。在这个过程中,使用了哈希算法,并且使用了分离链接法解决冲突的问题。使用哈希算法
可以提高查询速度,如果使用链表,查询时需要逐一比较,效率低下。

本文发布于:2024-09-22 05:40:02,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/398239.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:算法   使用   链表   冲突   称为   数据   方法   字符串
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议