哈希算法介绍

哈希算法介绍
LG GROUP system office room 【LGA16H-LGYY-LGUA8Q8-LGA162】
哈希算法简介
目录
1哈希算法概念 ...................................................... 2哈希函数 .......................................................... 3冲突的解决方法 .................................................... 4哈希算法应用 ......................................................
关键词:
算法、哈希、c语言
摘要:
哈希算法在软件开发和Linux内核中多次被使用,由此可以见哈希算法的实用性和重要性。

本文介绍了哈希算法的原理和应用,并给出了简略的代码实现,以便读者理解。

1哈希算法概念
哈希(hash 散列,音译为哈希)算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。

哈希值是一段数据唯一且极其紧凑的数值表示形式。

如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希算法都将产生不同的值。

要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。

哈希表是根据设定的哈希函数H(key)和处理冲突方法将一组关键字映象到一个有限的地址区间上,并以关键字在地址区间中的项作为记录在表中的存储位置,这种表称为哈希表,所得存储位置称为哈希地址。

作为线性数据结构与表格和队列等相比,哈希表无疑是查找速度比较快的一种。

查找一般是对项的摸个部分(及数据成员)进行,这部分称为键(key)。

例如,项可以由字符串作为键,附带一些数据成员。

理想的哈希表数据结构只不过是一个包含一些项的具有固定大小的数组。

通常的习惯是让项从0到 TableSize-1之间变化。

将每个键映射到0到TableSize-1 这个范围中的某个
数,并且将其放到适当的单元中,这个映射就称为散列函数
(hash funciton)。

如右图,john被散列到3,phil被散列到4,dave 被散列
到6,mary被散列到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结构体。

在这个过程中,使用了哈希算法,并且使用了分离链接法解决冲突的问题。

使用哈希算法可以提高查询速度,如果使用链表,查询时需要逐一比较,效率低下。

dev_name_head为哈希表,保存了所有项的链表头。

1 << NETDEV_HASHBITS 为表的大小。

full_name_hash为哈希函数,其主要目的是为了分布均匀避免冲突,这样可以提高查找效率。

这个应用比较简单,但是清晰的展现哈希算法的架构,而且容易理解。

哈希算法应用很多场景,比如管理组播MAC地址,文件系统,数据库,数据校验等等。

有兴趣可以深入研究,可以拓宽编程思路。

合集下载

哈希算法的用途

哈希算法的用途

哈希算法的用途一、引言在现代信息技术快速发展的背景下,数据的安全性和完整性越来越受到重视。

而哈希算法作为一种重要的数据处理方法,在数据加密、验证、唯一性标识等方面发挥着重要作用。

本文将介绍哈希算法的基本原理以及它在密码学、数据验证、数据完整性保护等方面的应用。

二、哈希算法的基本原理哈希算法是一种将任意长度的输入(也称为消息)转换为固定长度的输出的算法。

它的核心思想是利用一个散列函数,将输入数据映射成一个固定长度的哈希值。

哈希值的长度是固定的,不管输入数据的长度如何。

而且,即使输入数据的微小改动,也会导致哈希值的巨大改变。

三、密码学中的应用1. 数字签名哈希算法在数字签名中起到了重要作用。

数字签名是用于验证数据完整性和身份认证的一种技术。

发送者使用私钥对消息进行哈希计算,然后用私钥对哈希值进行加密,生成数字签名。

接收者使用公钥对数字签名进行解密,然后对消息进行哈希计算,将计算得到的哈希值与解密后的签名进行比较,以验证数据的完整性和发送者的身份。

2. 密码存储在用户密码存储方面,哈希算法也扮演着重要角色。

为了保护用户密码的安全性,往往不直接存储用户的明文密码,而是将密码进行哈希计算后存储。

当用户登录时,系统会对用户输入的密码进行哈希计算,然后与存储的哈希值进行比对,以验证密码的正确性。

这样即使数据库被攻击,黑客也无法直接获取用户的明文密码。

四、数据验证中的应用1. 文件完整性校验哈希算法可以用来验证文件的完整性。

对于一个文件,可以通过哈希算法计算出其哈希值,并将哈希值存储在一个可信的地方,如原始文件的服务器或者数字证书中。

当需要验证文件是否被篡改时,只需重新计算文件的哈希值,并与存储的哈希值进行比对即可。

如果两者一致,则说明文件未被篡改。

2. 数据传输完整性校验在数据传输过程中,为了确保数据的完整性,常常使用哈希算法进行校验。

发送方在发送数据之前,计算数据的哈希值,并将其随数据一起发送给接收方。

接收方在接收到数据后,同样计算数据的哈希值,并与发送方发送的哈希值进行比对。

哈 希 常 见 算 法 及 原 理

哈 希 常 见 算 法 及 原 理

数据结构与算法-基础算法篇-哈希算法1. 哈希算法如何防止数据库中的用户信息被脱库?你会如何存储用户密码这么重要的数据吗?仅仅 MD5 加密一下存储就够了吗?在实际开发中,我们应该如何用哈希算法解决问题?1. 什么是哈希算法?将任意长度的二进制值串映射成固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。

2. 如何设计一个优秀的哈希算法?单向哈希:从哈希值不能反向推导出哈希值(所以哈希算法也叫单向哈希算法)。

篡改无效:对输入敏感,哪怕原始数据只修改一个Bit,最后得到的哈希值也大不相同。

散列冲突:散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小。

执行效率:哈希算法的执行效率要尽量高效,针对较长的文本,也能快速计算哈希值。

2. 哈希算法的常见应用有哪些?7个常见应用:安全加密、唯一标识、数据校验、散列函数、负载均衡、数据分片、分布式存储。

1. 安全加密常用于加密的哈希算法:MD5:MD5 Message-Digest Algorithm,MD5消息摘要算法SHA:Secure Hash Algorithm,安全散列算法DES:Data Encryption Standard,数据加密标准AES:Advanced Encryption Standard,高级加密标准对用于加密的哈希算法,有两点格外重要,第一点是很难根据哈希值反向推导出原始数据,第二点是散列冲突的概率要小。

在实际开发中要权衡破解难度和计算时间来决定究竟使用哪种加密算法。

2. 唯一标识通过哈希算法计算出数据的唯一标识,从而用于高效检索数据。

3. 数据校验利用哈希算法对输入数据敏感的特点,可以对数据取哈希值,从而高效校验数据是否被篡改过。

4. 散列函数1.如何防止数据库中的用户信息被脱库?你会如何存储用户密码这么重要的数据吗?使用MD5进行加密字典攻击:如果用户信息被“脱库”,黑客虽然拿到的是加密之后的密文,但可以通过“猜”的方式来破解密码,这是因为,有些用户的密码太简单。

哈希算法特点

哈希算法特点

哈希算法特点哈希算法(Hashing)是一种常见的加密算法。

在计算机领域中,哈希算法主要用于密码的散列、数据摘要、唯一标识等应用场景中。

相比较于传统的加密算法,哈希算法具有以下几个特点:一、无法逆向推导哈希算法是一种把输入数据通过哈希函数转换成固定长度的输出数据,通常称为哈希值(Hash Value)。

哈希算法的一个重要特点是哈希值无法逆向推导出原始的输入数据,即使知道了输出数据,也无法计算出输入数据的值。

这也就意味着,哈希算法所产生的输出数据,是不可逆且唯一的。

即使加密算法的密钥被泄露,黑客也无法利用密钥来破解哈希值,保证了数据的安全性。

二、散列冲突概率低哈希算法的输出数据是具有固定长度的,这就意味着不同长度的输入数据都会被哈希函数压缩成相同长度的输出数据。

因此,在使用哈希算法时,必须意识到,同一个哈希值可能对应着多个不同的输入数据,这种情况叫做哈希碰撞(Hash Collision)。

哈希算法的另一个特点是,对于哈希函数的设计来说,散列冲突的概率是非常低的。

三、可靠性高哈希算法具有高可靠性。

在决定一个哈希算法时,除了如何防止哈希碰撞之外,还需要关注哈希函数在设计上的正确性。

正确的哈希函数应该能够对任意长度的输入数据,产生一个相同长度的哈希值,且具有固定性,也就是说,对于同一个输入数据,它所产生的哈希值总是相同的。

四、适用于大量数据处理哈希算法的另一个特点,就是适用于处理大量的数据。

在哈希值计算的过程中,输入数据的大小并不影响哈希算法的速度和效率。

即使计算的数据里有重复、无序,甚至是带有噪声,哈希算法仍然可以快速、高效地处理这些数据。

五、可高度定制化哈希算法可以根据不同的应用场景和需求进行高度定制化。

哈希函数是哈希算法的核心,不同的哈希函数之间具有不同的性能和特性。

在实际应用中,应该选择最合适的哈希函数,才能最大限度地保证哈希算法的效率和安全性。

综上所述,哈希算法具有不可逆向推导、散列冲突概率低、可靠性高、适用于大量数据处理、可高度定制化等几个重要特点。

计算哈希值的方法

计算哈希值的方法

计算哈希值的方法哈希值是一种通过数据内容计算出来的固定长度的字符串。

它具有以下特点:1.固定长度:哈希值的长度是固定的,无论输入数据的长度如何,哈希值的长度始终不变。

通常情况下,哈希值的长度由算法决定。

2.确定性:对于相同的输入数据,总是可以得到相同的哈希值。

3.不可逆性:从哈希值无法恢复出原始数据,即无法通过哈希值反推出输入数据的内容。

这是哈希算法的一种安全特性。

计算哈希值的方法有多种,这里我们主要介绍以下几种常见的哈希算法。

1. MD5 (Message Digest Algorithm 5)MD5是最早广泛应用的哈希算法之一,它将任意长度的数据作为输入,并输出一个128位的哈希值。

MD5算法已被证明不具备足够的安全性,容易受到碰撞攻击。

2. SHA (Secure Hash Algorithm)算法系列SHA算法系列是继MD5之后被广泛采用的哈希算法。

SHA系列包括SHA-1、SHA-224、SHA-256、SHA-384和SHA-512等不同长度的哈希算法。

SHA-1已经不再被推荐使用,因为它的哈希值长度为160位,安全性相对较低,而且存在碰撞攻击的问题。

SHA-256是目前广泛使用的SHA算法,其哈希值长度为256位。

3. CRC32 (Cyclic Redundancy Check)CRC32是一种经典的哈希算法,广泛应用于数据校验中。

它将任意长度的数据作为输入,并输出一个32位的哈希值。

CRC32主要用于检测数据在传输过程中是否发生了错误。

4. HMAC (Hash-based Message Authentication Code)HMAC是一种基于哈希算法的消息验证码,常用于网络通信中的数据完整性校验和身份认证。

HMAC通过在哈希过程中引入额外的密钥,增加了安全性。

5. BcryptBcrypt是一种用于密码存储的哈希算法。

与其他哈希算法不同的是,Bcrypt在计算哈希值时会引入随机盐,增加了密码的安全性。

哈希常用算法

哈希常用算法

哈希常用算法摘要:一、哈希简介二、哈希算法的分类1.碰撞哈希算法2.非碰撞哈希算法三、常用碰撞哈希算法及其原理1.md52.sha-13.sha-256四、常用非碰撞哈希算法及其原理1.adler-322.crc32五、哈希算法的应用场景与选择原则六、哈希算法的优化与改进正文:一、哈希简介哈希,又称散列,是一种将任意大小的数据映射到固定大小的数据的算法。

它在计算机科学和信息领域中具有广泛的应用,如数据完整性校验、数据压缩、文件加密等。

二、哈希算法的分类根据哈希值是否发生碰撞,哈希算法可分为碰撞哈希算法和非碰撞哈希算法。

1.碰撞哈希算法:哈希值可能发生碰撞,即不同的输入数据可能生成相同的哈希值。

这类算法主要包括md5、sha-1等。

2.非碰撞哈希算法:哈希值不可能发生碰撞,即不同的输入数据生成不同的哈希值。

这类算法主要包括adler-32、crc32等。

三、常用碰撞哈希算法及其原理1.md5:md5(Message-Digest Algorithm 5)是一种广泛应用的哈希算法,由Ronald Linn提出。

它将输入数据分成512比特进行处理,最终生成一个128位的哈希值。

md5算法存在碰撞,因此不适用于安全性要求较高的场景。

2.sha-1:sha-1(Secure Hash Algorithm 1)是美国国家安全局(NSA)制定的安全哈希算法,用于替代不安全的md5算法。

sha-1将输入数据分成512比特进行处理,最终生成一个160位的哈希值。

虽然sha-1相对安全,但在2017年,王小云等人发现了其漏洞,因此也不再推荐使用。

3.sha-256:sha-256是sha-2家族的一员,由美国国家安全局制定。

它将输入数据分成512比特进行处理,最终生成一个256位的哈希值。

sha-256相对安全,是目前较为推荐的哈希算法。

四、常用非碰撞哈希算法及其原理1.adler-32:adler-32是一种可逆的哈希算法,由Adler于1995年提出。

哈希编码算法

哈希编码算法

哈希编码算法哈希编码算法(Hash Coding)是一种将数据转换为固定长度哈希值的技术。

它被广泛应用在计算机科学领域,用于唯一标识数据、提高数据搜索效率和数据完整性验证等方面。

本文将介绍哈希编码算法的原理、应用场景以及一些常见的哈希算法。

一、哈希编码算法原理哈希编码算法的核心思想是将任意长度的数据转换为固定长度的哈希值。

这个哈希值通常是一个整数或字符串,具有固定长度。

哈希算法经过一系列的计算,通过对数据的处理,将数据映射到一个指定的范围内。

这个范围可以是一个固定长度的二进制位,比如32位或64位,也可以是一个固定长度的字符串。

哈希编码算法的优点在于它的高效性和唯一性。

通过哈希算法,我们可以快速地对数据进行索引和搜索,从而提高数据的处理速度。

同时,不同的数据经过哈希算法得到的哈希值是不同的,这一点保证了数据的唯一性。

二、哈希编码算法的应用场景1. 数据唯一标识在数据库中,为了保证数据的唯一性,常常要为每个数据记录生成一个唯一的标识。

这个标识通常就是通过哈希编码算法生成的。

这样,通过唯一标识,我们可以方便地对数据进行索引和快速定位。

2. 数据加密哈希编码算法在数据加密方面也发挥着重要作用。

比如,在密码存储时,我们通常不会直接将用户的密码明文存储在数据库中,而是通过哈希算法将密码转换为哈希值进行存储。

这样,就可以避免用户密码泄露造成的安全问题。

3. 数据校验在文件传输过程中,为了验证文件的完整性和一致性,常常需要对文件进行校验。

哈希编码算法可以对文件进行哈希运算,得到一个哈希值。

接收方可以通过比对哈希值来判断文件是否被篡改。

三、常见的哈希编码算法1. MD5MD5是最常见的哈希算法之一。

它接受任意长度的输入,返回固定长度的哈希值。

MD5生成的哈希值是一个128位的字符串,通常表示为32位的16进制数。

2. SHA-1SHA-1是安全哈希算法(Secure Hash Algorithm)的第一代版本。

什么是哈希哈希算法是怎么回事

什么是哈希哈希算法是怎么回事哈希(Hash)是一种将任意长度的输入数据通过一个固定大小的算法,运算为一个固定长度(通常是一串数字、字母、符号)的值的过程。

这个固定长度的输出被称为哈希值,也叫做摘要(Digest)或指纹(Fingerprint)。

哈希算法是实现哈希的数学计算方法。

哈希算法的主要特点是输入数据的任意长度都可以通过哈希算法计算为固定长度的哈希值。

这个哈希值相较于原始数据的输入具有以下几个重要特点:1.唯一性:不同的输入一般会生成不同的哈希值。

即使输入数据只改变了一丁点,生成的哈希值也会发生很大的变化。

唯一性是指无论输入数据有多长,哈希值始终有固定长度。

2.不可逆性:从哈希值无法推导出原始数据。

即使哈希值的长度相对较短,也很难从中反推出原始数据的内容。

3.无法修改:对于同一输入数据,无论经过多少次哈希计算,得到的结果是相同的。

但是,即使输入数据只改变了一丁点,生成的哈希值也会发生很大的变化。

哈希算法常用在密码学、数据完整性校验、数据指纹识别等领域。

在密码学中,哈希算法被广泛应用于密码存储、数字签名、消息认证码等方面,以保证数据的安全性和完整性。

常见的哈希算法包括MD5、SHA-1、SHA-256等。

其中,MD5算法产生128位的哈希值,SHA-1算法产生160位的哈希值,而SHA-256算法产生256位的哈希值。

不同的哈希算法在哈希值的长度、计算速度和安全性等方面存在差异。

哈希算法的基本原理是将输入数据作为算法的输入,通过算法的运算,不断变换数据的位和位之间的关系,最终得到一个固定长度的哈希值。

具体的算法设计目标是尽可能地提高哈希值的唯一性和不可逆性,并且在计算速度和资源消耗方面具有较好的平衡。

总结来说,哈希是通过一个固定大小的算法将任意长度的输入数据转化为一个固定长度的输出值。

哈希算法具有唯一性、不可逆性和无法修改性等特点,常用于密码学、数据完整性校验等领域。

不同的哈希算法在哈希值的长度和安全性等方面存在差异,而碰撞是哈希算法设计中需要避免的问题。

哈 希 常 见 算 法 及 原 理

Python算法系列-哈希算法哈希算法一、常见数据查找算法简介二、什么是哈希三、实例:两个数字的和1.问题描述2.双指针办法解决3.哈希算法求解四、总结哈希算法又称散列函数算法,是一种查找算法。

就是把一些复杂的数据通过某种映射关系。

映射成更容易查找的方式,但这种映射关系可能会发生多个关键字映射到同一地址的现象,我们称之为冲突。

在这种情况下,我们需要对关键字进行二次或更多次处理。

出这种情况外,哈希算法可以实现在常数时间内存储和查找这些关键字。

一、常见数据查找算法简介常见的数据查找算法:顺序查找:是最简单的查找方法。

需要对数据集中的逐个匹配。

所以效率相对较低,不太适合大量数据的查找问题。

二分法查找:效率很高,但是要求数据必须有序。

面对数据排序通常需要更多的时间。

深度优先和广度优先算法:对于大量的数据查找问题,效率并不高。

这个我们后面专门讲解。

阿希查找算法:查找速度快,查询插入,删除操作简单等原因获得广泛的应用。

二、什么是哈希哈希查找的原理:根据数量预先设一个长度为M的数组。

使用一个哈希函数F并以数据的关键字作为自变量得到唯一的返回值,返回值的范围是0~M-1。

这样就可以利用哈希函数F将数据元素映射到一个数组的某一位下标,并把数据存放在对应位置,查找时利用哈希函数F计算,该数据应存放在哪里,在相应的存储位置取出查找的数据。

这里就有一个问题:关键字的取值在一个很大的范围,数据在通过哈希函数进行映射时。

很难找到一个哈希函数,使得这些关键字都能映射到唯一的值。

就会出现多个关键字映射到同一个值的现象,这种现象我们称之为冲突。

哈西算法冲突的解决方案有很多:链地址法,二次再散列法。

线性探测再散列建立一个公共溢出区注意:链地址法本质是数组+链表的数据结构链地址法存储数据过程:首先建立一个数组哈希存储所有链表的头指针。

由数组的关键字key 通过对应的哈希函数计算出哈希地址。

找到相应的桶号之后,建立新的节点存储该数据。

哈希算法通俗理解

哈希算法通俗理解哈希算法是一种常见的加密技术,无论是在计算机科学还是密码学领域,都有广泛的应用。

如果你想了解有关哈希算法的相关知识,本文将为您提供详细的解释和思路。

第一步:什么是哈希算法?哈希算法是一种数据加密的技术,它可以将任意长度的消息转换为一定长度的固定数据。

这种固定大小的输出就被称为哈希值或散列值。

结果是一个数字,通常是32个字符长的十六进制字符串。

通过使用哈希函数,哈希算法将数据压缩成较小的值。

这个过程是唯一的,因为不同的输入将始终转换为不同的输出。

这使得哈希算法成为安全性高,且在数据处理速度方面比其他解决方案更具优势的加密技术。

第二步:哈希算法的主要特征是什么?哈希算法有以下几个主要特征:1. 唯一性: 哈希算法是双向的,它们总是能将同一输入生成相同的输出。

但是,甚至是微小的数据变化都会导致输出的不同。

这是哈希算法的唯一性特征。

2. 不可逆性:哈希算法是不可逆的,输出无法反向推导出相应的输入。

3. 抗碰撞性:哈希算法的高抗碰撞性是指当不同的输出值对应相同的输入值时,需要消耗相当的算力来达到这一目的。

第三步:哈希算法的应用场景?哈希算法在它的安全性方面有着广泛应用,包括:1. 数据防篡改:哈希算法通过生成哈希值来确保数据在传输过程中的完整性和真实性。

这个特性在数字内容和网络安全上有很大的价值。

2. 用户密码:哈希算法通常用于加密用户密码。

当一个用户创建一个帐户时,其密码被哈希并存储在数据库中。

当该用户登录时,哈希算法处理用户提供的密码,并将其与数据库中存储的哈希值进行比较。

验证密码时,系统无需存储明文密码,而是使用哈希值。

这是常见的数据库安全特性。

3. 数字签名:哈希函数可以生成一个数字签名,用于验证文档或文件的真实性和完整性。

哈希值或签名保证文档的完整性,而数字签名则附上了签名者的身份鉴别,验证人可以确定传输的材料没有被篡改,也没有被伪造。

第四步:哈希算法的类型哈希算法可以分为两类:1. 对称哈希算法,也称为密码哈希算法。

哈希算法介绍

哈希算法简介目录关键词:算法、哈希、c语言摘要:哈希算法在软件开发和Linux内核中多次被使用,由此可以见哈希算法的实用性和重要性;本文介绍了哈希算法的原理和应用,并给出了简略的代码实现,以便读者理解;1哈希算法概念哈希hash 散列,音译为哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值;哈希值是一段数据唯一且极其紧凑的数值表示形式;如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希算法都将产生不同的值;要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性;哈希表是根据设定的Hkey和处理冲突方法将一组关键字映象到一个有限的地址区间上,并以关键字在地址区间中的项作为记录在表中的存储位置,这种表称为,所得存储位置称为哈希地址;作为线性数据结构与表格和队列等相比,哈希表无疑是查找速度比较快的一种;查找一般是对项的摸个部分及数据成员进行,这部分称为键key;例如,项可以由字符串作为键,附带一些数据成员;理想的哈希表数据结构只不过是一个包含一些项的具有固定大小的数组;通常的习惯是让项从0到 TableSize-1之间变化;将每个键映射到0到TableSize-1 这个范围中的某个数 ,并且将其放到适当的单元中,这个映射就称为散列函数hashfunciton;如右图,john被散列到3,phil被散列到4,dave 被散列到6,mary被散列到7.这是哈希的基本思想;剩下的问题则是要选择一个函数,决定当两个键散列到同一个值的时候称为冲突,应该做什么;2哈希函数通常,键是字符串,一种选择方法是把字符串中字符ASCII码值加起来;unsigned int hash const char key, int tableSize{unsigned int hastVal = 0;for int i = 0; i < strlenkey; i++hashVal += key i ;return hashVal % tableSize;}通过对ASCII码总和取tableSize的余数,来确定哈希值;这是个简单的示例,实现起来很简单而且能够很快地算出答案;不过,如果表很大,则函数不会很好地分配键;由于ASCII字符的值最多为127,如果输入的key,都是长度比较小的字符串,那么返回的键值哈希值就会集中在哈希表的头部,这样就会分配不均匀;好的哈希算法这部分会非常复杂,这里仅仅做个介绍;在下面的哈希算法应用中会介绍linux内核如何使用哈希算法管理网络设备结构;3冲突的解决方法在使用哈希算法时,除了哈希函数之外,还需要注意的是冲突两个键散列到同一个值的时候的处理;常用的处理方式有分离链接法、线性探测、平方探测;由于线性探测和平方探测涉及到一些数学问题,本文就介绍分离链接法;分离链接法也比较简单,其做法为将散列到同一个值的所有元素保留到一个链表中;如上图所示,所有哈希表项对应一个链表,这样只要将冲突项放入链表就行,当查找时先找到链表,然后在比较链表上项的键,得到想要的项,这个方法比较容易实现,但是会增加查找的耗时,原来只需计算哈希值,现在增加了对链表项的比较功能;4哈希算法应用下面看看linux内核中网络设备,是怎么样通过设备名获取相应设备的net_device结构体;在这个过程中,使用了哈希算法,并且使用了分离链接法解决冲突的问题;使用哈希算法可以提高查询速度,如果使用链表,查询时需要逐一比较,效率低下;dev_name_head为哈希表,保存了所有项的链表头;1 << NETDEV_HASHBITS 为表的大小;full_name_hash为哈希函数,其主要目的是为了分布均匀避免冲突,这样可以提高查找效率;这个应用比较简单,但是清晰的展现哈希算法的架构,而且容易理解;哈希算法应用很多场景,比如管理组播MAC地址,文件系统,数据库,数据校验等等;有兴趣可以深入研究,可以拓宽编程思路;。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档