散列函数
- 格式:doc
- 大小:16.50 KB
- 文档页数:2
散列函数实验原理散列函数是计算机科学中的重要概念,用于将任意长度的输入数据映射为固定长度的输出数据,通常用于数据存储、数据检索和安全领域。
1.散列函数的定义散列函数是一种确定性函数,它接收任意长度数据作为输入,并输出固定长度的散列值。
其定义如下:H(x)=y,其中x为输入数据,y为输出的散列值。
2.散列函数的特性-确定性:相同的输入将产生相同的输出,可以保证数据的一致性。
-输入不同性:不同的输入应产生不同的输出,避免冲突和碰撞。
-输出一致性:无论输入数据的大小,输出的散列值长度应保持固定。
3.散列函数的应用-数据存储:散列函数常用于哈希表的实现。
数据通过散列函数计算出索引值,从而快速访问和检索数据。
-数据校验:散列函数可以用于验证数据的完整性和一致性。
比如,在文件传输过程中,发送方可以计算数据的散列值,并发送给接收方,接收方在接收到数据后再次计算散列值并与传输过来的散列值进行比对,以确认数据是否被篡改。
-密码学安全:散列函数广泛应用于密码学算法中,如消息认证码(HMAC)、数字签名(RSA)等。
散列函数用来保证数据的不可逆性和消息的完整性。
4.散列函数的实现原理散列函数的实现可以使用不同的方法和算法,下面介绍几种常见的散列函数实现原理。
-哈希函数表:通过查找表的方式,将每个输入的数据值映射到一个唯一的输出值,如使用一个长度固定的数组作为存储空间,将数据对应的索引存储在数组中。
-数字分析方法:通过对输入数据进行分析,提取关键信息,再进行一系列的逻辑运算,最终得到散列值。
比如,CRC校验中就使用了数字分析方法。
-数学方法:利用数学运算的特性,如乘法、除法、模运算等,将输入数据转化为散列值。
MD5和SHA-1就是基于数学方法实现的散列函数。
-加法混合法:通过将输入数据划分为不同的组,并对每个组进行加法运算,再将结果相加,最终得到散列值。
这种方法常用于简单的散列函数实现。
5.散列函数的安全性问题-弱碰撞:找到两个不同的输入数据,使得它们经过散列函数计算后产生相同的散列值。
散列函数种类散列函数是一种将任意长度的输入数据映射为固定长度输出数据的函数。
散列函数的主要作用是将数据压缩成固定长度的哈希值,以便于在数据结构中进行快速查找和比较。
在实际应用中,不同的散列函数有不同的特点和适用场景。
本文将介绍几种常见的散列函数种类。
1. MD5散列函数MD5散列函数是一种广泛使用的散列函数,它可以将任意长度的输入数据压缩成128位的哈希值。
MD5散列函数具有高度的安全性和不可逆性,因此在密码存储和数字签名等领域得到了广泛应用。
但是,由于MD5散列函数存在碰撞攻击的漏洞,因此在一些安全性要求较高的场景中,不建议使用MD5散列函数。
2. SHA散列函数SHA散列函数是一种安全性更高的散列函数,它可以将任意长度的输入数据压缩成160位的哈希值。
SHA散列函数具有更高的安全性和更强的抗碰撞攻击能力,因此在数字签名、消息认证和数据完整性校验等领域得到了广泛应用。
SHA散列函数有多个版本,包括SHA-1、SHA-2和SHA-3等,其中SHA-2是目前应用最广泛的版本。
3. MurmurHash散列函数MurmurHash散列函数是一种快速的散列函数,它可以将任意长度的输入数据压缩成32位或64位的哈希值。
MurmurHash散列函数具有高度的随机性和低碰撞率,因此在哈希表、布隆过滤器和数据分片等领域得到了广泛应用。
MurmurHash散列函数的速度比MD5和SHA散列函数更快,因此在对速度要求较高的场景中,可以考虑使用MurmurHash散列函数。
4. CityHash散列函数CityHash散列函数是一种高效的散列函数,它可以将任意长度的输入数据压缩成64位或128位的哈希值。
CityHash散列函数具有高度的随机性和低碰撞率,同时还具有较好的分布性和可扩展性,因此在大规模数据处理和分布式系统中得到了广泛应用。
CityHash散列函数的速度比MurmurHash散列函数更快,因此在对速度要求极高的场景中,可以考虑使用CityHash散列函数。
散列函数说法正确【最新版】目录1.散列函数的定义和作用2.散列函数的特点3.散列函数的应用4.散列函数的安全性5.结论正文一、散列函数的定义和作用散列函数,又称哈希函数(Hash Function),是一种将不同长度的输入数据转化为固定长度输出的函数。
这个输出通常被称为散列值(Hash Value)或哈希值。
散列函数的主要作用是快速计算和比较数据,以实现数据的加密、完整性校验和高效存储等功能。
二、散列函数的特点1.确定性:散列函数对于相同的输入数据会产生相同的输出结果,即具有确定性。
2.随机性:散列函数的输出结果具有较高的随机性,难以预测。
3.唯一性:在一定长度范围内,散列函数的输出结果具有唯一性,即不同的输入数据很难产生相同的输出结果。
4.抗碰撞性:散列函数的设计需要尽可能避免相同的输入数据产生相同的输出结果,以保证数据的唯一性。
三、散列函数的应用1.数据加密:散列函数可以用于对敏感数据进行加密,保护数据安全。
2.数据完整性校验:散列函数可以用于对数据进行完整性校验,检测数据是否被篡改。
3.数据压缩与存储:散列函数可以用于对数据进行压缩,减少存储空间。
同时,散列值可以作为数据的键进行高效存储和检索。
4.密码保护:散列函数可以用于实现密码保护功能,例如常见的“密码找回”功能。
四、散列函数的安全性散列函数的安全性是其应用的关键。
为了保证散列函数的安全性,需要满足以下条件:1.碰撞耐性:散列函数的输出结果具有抗碰撞性,即相同的输入数据产生相同的输出结果,不同的输入数据很难产生相同的输出结果。
2.单向性:散列函数具有单向性,即难以通过已知的散列值推导出原始输入数据。
3.抗修改性:散列函数的输出结果具有抗修改性,即对输入数据的任意修改都应该能够显著地改变散列函数的输出结果。
五、结论散列函数是一种重要的数据处理工具,具有确定性、随机性、唯一性和抗碰撞性等特点,广泛应用于数据加密、完整性校验、数据压缩与存储以及密码保护等领域。
散列函数的特点散列函数是一种将输入数据映射到固定长度的输出数据的函数。
它具有以下几个特点:1. 唯一性:给定一个输入,散列函数会生成一个唯一的输出。
即使输入的数据非常相似,只要有微小的改变,散列函数的输出也会完全不同。
这样可以确保散列函数对不同的输入有不同的输出,降低了冲突的概率。
2. 固定长度:散列函数会将输入数据映射到固定长度的输出,无论输入数据的大小。
这使得散列函数的输出具有固定的长度,方便存储和比较。
3. 高速性:散列函数的计算速度通常很快,即使输入数据非常大。
这是因为散列函数的设计通常经过了优化,采用了高效的算法和数据结构。
4. 不可逆性:散列函数是一种单向函数,即无法从散列值推导出原始输入数据。
这样可以保护输入数据的机密性,防止敏感信息泄露。
5. 随机性:好的散列函数应该具有良好的随机性,即使输入数据只有微小的变化,散列函数的输出也应该有较大的差异。
这样可以避免冲突,提高散列函数的安全性和可靠性。
6. 分散性:散列函数应该能够将输入数据均匀地分散到输出空间中。
这样可以降低冲突的概率,提高散列函数的效率和性能。
7. 碰撞概率:散列函数的碰撞概率是指两个不同的输入数据经过散列函数后产生相同的输出值的概率。
好的散列函数应该具有低碰撞概率,即不同的输入数据产生相同的输出值的概率很低。
散列函数在计算机科学和密码学中有着广泛的应用。
在数据结构中,散列函数常用于哈希表的实现,用于快速查找和插入数据。
在密码学中,散列函数被用于生成密码的摘要,用于验证数据的完整性和验证用户的身份。
散列函数的特点使得它在很多领域都有重要的作用。
通过将输入数据映射到固定长度的输出,散列函数可以提高数据的存储和比较效率。
同时,散列函数的不可逆性和随机性保护了数据的机密性和安全性。
好的散列函数应该具有良好的分散性和低碰撞概率,以提高散列函数的性能和可靠性。
散列函数是一种将输入数据映射到固定长度的输出数据的函数,具有唯一性、固定长度、高速性、不可逆性、随机性、分散性和低碰撞概率等特点。
哈希函数和散列函数
哈希函数和散列函数是计算机科学中非常重要的概念。
哈希函数是一种将任意长度的消息映射到固定长度的消息的函数。
散列函数是一种将任意长度的消息映射到固定长度的消息的函数,但它还具有单向性质,即从散列值推导原始消息的难度非常大。
哈希函数可以用于数据的完整性验证、密码学中的消息摘要、散列表等场景。
常见的哈希函数有MD5、SHA-1、SHA-256等。
散列函数则可以用于密码学中的数字签名、加密算法等场景。
常见的散列函数有SHA-1、SHA-2、SHA-3等。
值得注意的是,哈希函数和散列函数虽然都可以将任意长度的消息映射到固定长度的消息,但它们的安全性和用途不同。
对于哈希函数,由于存在哈希碰撞的可能性,因此不能保证将不同的消息映射到不同的哈希值。
而对于散列函数,由于具有单向性质,因此即使知道散列值,也很难推导出原始消息。
在使用哈希函数和散列函数时,需要注意选择合适的算法,根据实际场景进行适当的参数配置,以保证数据的安全。
- 1 -。
哈希散列函数的特征1. 哈希散列函数的定义哈希散列函数是一种将任意长度的输入转换为固定长度输出的算法。
它能够将输入数据映射到一个固定大小的哈希值,该哈希值通常用于标识输入数据。
2. 哈希散列函数的特点哈希散列函数具有以下几个重要的特点:2.1 确定性给定相同的输入,哈希散列函数总是会产生相同的输出。
这使得哈希散列函数可以用于验证数据的完整性。
2.2 快速计算哈希散列函数需要快速计算,即使输入数据很大也要保持较高的计算效率。
这使得哈希散列函数适用于大规模数据的处理。
2.3 输入长度不受限制哈希散列函数接受任意长度的输入数据,并将其映射为固定长度的哈希值。
这使得哈希散列函数适用于各种输入数据的处理。
2.4 输出长度固定哈希散列函数的输出长度通常是固定的,不会随着输入数据的大小而改变。
这使得哈希散列函数的输出可以作为数据的唯一标识。
3. 哈希散列函数的应用哈希散列函数在计算机科学和密码学中有着广泛的应用,包括但不限于以下领域:3.1 数据唯一性验证哈希散列函数可以用于验证数据的唯一性。
通过将数据的哈希值进行比较,可以判断两个数据是否一致,从而保证数据的完整性。
3.2 密码存储与验证哈希散列函数常用于密码存储与验证。
将用户的密码通过哈希函数计算得到哈希值,然后将哈希值存储在数据库中。
当用户登录时,系统会将用户输入的密码经过哈希函数计算得到哈希值,并与存储的哈希值进行比较,以验证密码的正确性。
3.3 数据加密与解密哈希散列函数可以用于数据的加密与解密。
常见的应用场景包括数字签名、数据完整性验证和身份验证等。
3.4 哈希表哈希散列函数也被广泛应用于哈希表中。
哈希表是一种基于哈希散列函数的数据结构,可以用于高效地存储和查找数据。
4. 哈希散列函数的特性除了上述特点和应用外,哈希散列函数还具有以下一些重要的特性:4.1 高效性哈希散列函数的计算速度通常很快,能够在常数时间内完成计算。
这使得它在处理大规模数据时具有较高的效率。
散列函数基本原理散列函数(Hash Function)是一种将任意长度的输入数据映射为固定长度的输出数据的算法。
它具有以下几个基本原理:1. 固定长度输出:散列函数需要将任意长度的输入数据映射为固定长度的输出数据。
这意味着无论输入数据的大小如何,散列函数的输出结果都具有相同的长度。
通常情况下,散列函数的输出结果被称为散列值(Hash Value)或者摘要(Digest)。
2. 唯一性:散列函数对于不同的输入数据,应该生成不同的输出数据,即不同的输入应该具有不同的散列值。
这种特性被称为唯一性或者抗碰撞性。
实际上,由于输入数据的长度远远大于散列值的长度,所以在理论上存在多个不同的输入数据产生相同的散列值。
这种情况被称为碰撞(Collision)。
好的散列函数需要尽可能地减小碰撞的概率。
3.高效性:散列函数的计算速度应该尽可能地快,即使对于大规模的输入数据,也能在合理的时间内完成计算。
高效性是散列函数的重要性能指标之一,尤其对于需要频繁进行散列计算的场景非常重要。
4.不可逆性:散列函数应该是不可逆的。
也就是说,通过散列值无法恢复出原始的输入数据。
这种特性被称为不可逆性或者抗逆性。
这一特性保证了通过散列值,无法得到原始的输入数据,从而保护了数据的隐私和安全。
在实际应用中,散列函数具有广泛的应用。
以下是几个常见的应用场景:1.数据完整性验证:散列函数可以用于验证数据在传输过程中是否发生了改变。
发送方可以通过对数据进行散列计算,得到散列值,并将其发送给接收方。
接收方在接收到数据后,再次进行散列计算,并将计算得到的散列值与接收到的散列值进行比对。
如果两个散列值相同,说明数据在传输过程中没有发生改变。
否则,说明数据可能被篡改,发送方和接收方都可以得到相应的提醒。
3. 数据映射和索引:散列函数是实现哈希表(Hash Table)的基础。
哈希表是一种用于存储和查找数据的数据结构。
散列函数将输入数据映射为散列值,并将散列值作为索引,将数据存储在对应的位置。
杂凑函数散列函数一、杂凑函数杂凑函数是一种将任意长度的输入数据(也称为关键字)转换为固定长度的输出数据的方法。
输出数据的长度通常被称为散列值的位数。
由于杂凑函数在处理大量数据时,可以将数据分布到固定长度的散列表中,因此它们在密码学、数据压缩、数据存储等领域得到了广泛应用。
1. 杂凑函数的原理杂凑函数的基本原理是将输入数据通过一系列复杂的数学运算,生成一个散列值。
这些数学运算通常包括哈希函数、压缩函数、置换函数等。
杂凑函数的输出结果应该是散列值,而不是具体的数据,因此其输出结果通常无法直接与输入数据建立一一对应的关系。
2. 杂凑函数的性能指标性能指标主要包括散列值的位数、碰撞率、负载因子等。
散列值的位数决定了输出的散列值可以表示的长度,对于某些应用来说,过短的位数可能会导致数据无法有效存储或检索。
碰撞率是指两个不同的输入数据生成相同散列值的情况,负载因子则是指散列表中存储的键值对数量与散列表容量的比值。
3. 常见杂凑函数算法常见的杂凑函数算法包括MD5、SHA-1、SHA-256等。
这些算法均采用了特定的数学运算方法,如乘法、位移、异或等操作,生成散列值。
此外,这些算法通常还提供了碰撞检测机制,以保证输出的散列值是唯一的。
二、散列函数散列函数是一种将任意长度的数据转换为固定长度的数据的函数,但与杂凑函数不同的是,散列函数通常要求在已知输出结果的情况下,能够通过输入数据重新得到输出结果,而不需要进行其他复杂的数学运算。
散列函数在密码学中具有重要的应用价值,例如哈希链的构建、数字签名等。
1. 散列函数的性能指标散列函数的性能指标主要包括碰撞率、单向性、计算复杂度等。
碰撞率是指两个不同的输入数据产生相同散列值的情况,单向性是指无法从散列值反推出原始输入数据,计算复杂度则是指生成散列值所需的时间和空间。
2. 常见散列函数算法常见的散列函数算法包括MD4、SHA-0、SHA-3等。
这些算法在计算过程中采用了多种不同的技术手段,如特殊的哈希函数结构、位运算等操作,以实现高效的散列计算。
杂凑函数(散列函数)1. 定义杂凑函数(Hash Function),也称为散列函数,是一种将任意大小的数据映射到固定大小的数据的函数。
它将输入数据通过一系列的计算操作,转换成一个固定长度的输出,通常称为散列值或哈希值。
杂凑函数是密码学、数据完整性校验、数据索引等领域中重要的基础工具。
2. 用途杂凑函数有广泛的应用,主要包括以下几个方面:2.1 数据完整性校验杂凑函数可以用于验证数据的完整性,即通过计算数据的散列值,然后与预先保存的正确散列值进行比对,来判断数据是否被篡改。
这在网络传输、文件存储等场景中非常重要,可以有效防止数据被篡改而不被察觉。
2.2 数据唯一标识杂凑函数可以将数据映射为唯一的散列值。
由于散列值的长度固定,可以大大减小数据的存储空间。
在数据索引、数据库中,可以使用散列值作为数据的唯一标识,提高数据的查询和存储效率。
2.3 密码学杂凑函数在密码学中有重要的应用。
比如,密码存储时通常不会直接保存明文密码,而是将密码的散列值保存在数据库中。
当用户登录时,输入的密码经过散列计算后与数据库中的散列值进行比对,以验证用户的身份。
2.4 数据分片杂凑函数可以将数据按照一定的规则进行分片,将大规模数据分散存储在不同的节点上。
这样可以提高数据的并行处理能力和分布式存储系统的可扩展性。
3. 工作方式杂凑函数的工作方式主要包括两个方面:输入处理和输出生成。
3.1 输入处理杂凑函数接受一个任意长度的输入数据,并经过一系列的计算操作将其转换为固定长度的中间结果。
常见的输入处理操作包括:•消息扩展:将输入数据进行填充,使其长度满足计算要求。
常见的填充方式有补零、补位数等。
•消息分块:将输入数据按照固定长度进行划分,得到多个块。
每个块独立处理,可以提高计算效率。
•迭代计算:对每个数据块进行迭代计算,将当前数据块的计算结果作为下一个数据块的输入,直到处理完所有数据块。
3.2 输出生成经过输入处理后,杂凑函数会生成一个固定长度的输出,即散列值或哈希值。
Hash(散列函数)Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。
这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。
简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数基本概念编辑若结构中存在和关键字K相等的记录,则必定在f(K)的存储位置上。
由此,不需比较便可直接取得所查记录。
称这个对应关系f为散列函数(Hash function),按这个事先建立的表为散列表。
对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称碰撞。
具有相同函数值的关键字对该散列函数来说称做同义词。
综上所述,根据散列函数H(key)和处理冲突的方法将一组关键字映射到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象” 作为记录在表中的存储位置,这种表便称为散列表,这一映象过程称为散列造表或散列,所得的存储位置称散列地址。
若对于关键字集合中的任一个关键字,经散列函数映象到地址集合中任何一个地址的概率是相等的,则称此类散列函数为均匀散列函数(Uniform Hash function),这就是使关键字经过散列函数得到一个“随机的地址”,从而减少冲突。
性质所有散列函数都有如下一个基本特性:如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。
这个特性是散列函数具有确定性的结果。
但另一方面,散列函数的输入和输出不是一一对应的,如果两个散列值相同,两个输入值很可能是相同的,但不绝对肯定二者一定相等(可能出现哈希碰撞)。
输入一些数据计算出散列值,然后部分改变输入值,一个具有强混淆特性的散列函数会产生一个完全不同的散列值。
[1]典型的散列函数都有无限定义域,比如任意长度的字节字符串,和有限的值域,比如固定长度的比特串。
散列函数及其应⽤散列函数 散列,英⽂Hash,也有直接⾳译为“哈希”的,就是把任意长度的输⼊(⼜叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。
这种转换是⼀种压缩映射,也就是,散列值的空间通常远⼩于输⼊的空间,不同的输⼊可能会散列成相同的输出,所以不可能从散列值来确定唯⼀的输⼊值。
简单的说就是⼀种将任意长度的消息压缩到某⼀固定长度的信息摘要的函数。
散列函数的应⽤ 在算法竞赛中,我所接触到的主要有字符串hash⽤于把字符串“索引”为⼀个值,然后对复杂字符串进⾏操作,来加快遍历速度,降低算法复杂度。
把字符串匹配转移到了值匹配。
但是散列函数属于⼀种“概率型算法”,对于模的取值有⼀定概率出现碰撞。
所以在算法竞赛中不常使⽤,或者要多次测验避免碰撞。
在信息安全⽅⾯的应⽤主要体现在以下的3个⽅⾯: 1)⽂件校验 我们⽐较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能⼒,它们⼀定程度上能检测并纠正数据传输中的信道误码,但却不能防⽌对数据的恶意破坏。
MD5 Hash算法的"数字指纹"特性,使它成为⽬前应⽤最⼴泛的⼀种⽂件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。
2)数字签名 Hash 算法也是现代密码体系中的⼀个重要组成部分。
由于⾮对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了⼀个重要的⾓⾊。
对 Hash 值,⼜称"数字摘要"进⾏数字签名,在统计上可以认为与对⽂件本⾝进⾏数字签名是等效的。
⽽且这样的协议还有其他的优点。
3)鉴权协议 如下的鉴权协议⼜被称作"挑战--认证模式:在传输信道是可被侦听,但不可被篡改的情况下,这是⼀种简单⽽安全的⽅法。
散列函数的安全性 两个不同的输⼊,经过哈希算法后,得到了同样的哈希值,就叫做哈希碰撞。
消息认证和散列(Hash)函数1 散列函数1.1散列函数的概念1.2 简单散列函数的构造1.3 作为消息认证的散列函数应具有的特性2 基于散列函数的消息认证方式2.1 对称密钥加密方式2.2 公开密钥与对称密钥结合的加密方式2.3公共秘密值方式在网络通信环境中,可能存在下述攻击:1.泄密:将消息透露给没有合法密钥的任何人或程序。
2.传输分析:分析通信双方的通信模式。
在面向连接的应用中,确定连接的频率和持续时间;在面向业务或无连接的环境中,确定双方的消息数量和长度。
3.伪装:欺诈源向网络中插入一条消息,如攻击者产生一条消息并声称这条消息是来自某合法实体,或者非消息接受方发送的关于收到或未收到消息的欺诈应答。
4.内容修改:对消息内容的修改,包括插入、删除、转换和修改。
5.顺序修改:对通信双方消息顺序的修改,包括插入、删除和重新排序。
6.计时修改:对消息的延时和重放。
7.发送方否认:发送方否认发送过某消息。
8.接收方否认:接收方否认接收到某消息。
其中,对付前两种攻击的方法属于消息保密性范畴;对付第3种至第6种攻击的方法一般称为消息认证;对如第7种攻击的方法属于数字签名;对付第8种攻击需要使用数字签名和为抗此种攻击而涉及的协议。
这样归纳起来,消息认证就是验证所收到的消息确实来自真正的发送方且未被修改的消息,它也可验证消息的顺序和及时性。
任何消息认证在功能上基本可看做有两层。
下层中一定有某种产生认证符的函数,认证符是一个用来认证消息的值;上层协议中将该函数作为原语使接收方可以验证消息的真实性。
产生认证符的函数类型通常可以分为以下三类:1.消息加密:整个消息的密文作为认证符。
2.Hash函数:它是将任意长的消息映射为定长的hash值得公开函数,以该hash 值作为认证符。
3.消息认证码(MAC):它是消息和密钥的公开函数,它产生定长的值,以该值作为认证符。
实际上消息认证码也属于Hash函数的范畴,它是带密钥的Hash函数。
散列函数
又称hash函数,Hash函数(也称杂凑函数或杂凑算法)就是把任意长的输入消息串变化成固定长的输出串的一种函数。
这个输出串称为该消息的杂凑值。
一般用于产生消息摘要,密钥加密等.
一个安全的杂凑函数应该至少满足以下几个条件:
①输入长度是任意的;
②输出长度是固定的,根据目前的计算技术应至少取128bits长,以便抵抗生日攻击;
③对每一个给定的输入,计算输出即杂凑值是很容易的
④给定杂凑函数的描述,找到两个不同的输入消息杂凑到同一个值是计算上不可行的,或给定杂凑函数的描述和一个随机选择的消息,找到另一个与该消息不同的消息使得它们杂凑到同一个值是计算上不可行的。
Hash函数主要用于完整性校验和提高数字签名的有效性,目前已有很多方案。
这些算法都是伪随机函数,任何杂凑值都是等可能的。
输出并不以可辨别的方式依赖于输入;在任何输入串中单个比特的变化,将会导致输出比特串中大约一半的比特发生变化。
常见散列函数(Hash函数)
·MD5(Message Digest Algorithm 5):是RSA数据安全公司开发的一种单向散列算法,MD5被广泛使用,可以用来把不同长度的数据块进行暗码运算成一个128位的数值;
·SHA(Secure Hash Algorithm)这是一种较新的散列算法,可以对任意长度的数据运算生成一个160位的数值;
·MAC(Message Authentication Code):消息认证代码,是一种使用密钥的单向函数,可以用它们在系统上或用户之间认证文件或消息。
HMAC(用于消息认证的密钥散列法)就是这种函数的一个例子。
·CRC(Cyclic Redundancy Check):循环冗余校验码,CRC校验由于实现简单,检错能力强,被广泛使用在各种数据校验应用中。
占用系统资源少,用软硬件均能实现,是进行数据传输差错检测地一种很好的手段(CRC 并不是严格意义上的散列算法,但它的作用与散列算法大致相同,所以归于此类)。
讨论几种散列函数。
在以下的讨论中,我们假设处理的是值为整型的关键码,否则我们总可以建立一种关键码与正整数之间的一一对应关系,从而把该关键码的检索转化为对与其对应的正整数的检索;同时,进一步假定散列函数的值落在0到M-1之间。
散列函数的选取原则是:运算尽可能简单;函数的值域必须在散列表的范围内;尽可能使得结点均匀分布,也就是尽量让不同的关键码具有不同的散列函数值。
需要考虑各种因素:关键码长度、散列表大小、关键码分布情况、记录的检索频率等等。
下面我们介绍几种常用的散列函数。
1、除余法
顾名思义,除余法就是用关键码x除以M(往往取散列表长度),并取余数作为散列地址。
除余法几乎是最简单的散列方法,散列函数为:h(x) =x mod M。
2、乘余取整法
使用此方法时,先让关键码key乘上一个常数A (0< A < 1),提取乘积的小数部分。
然后,再用整数n乘以这个值,对结果向下取整,把它做为散列的地址。
散列函数为:hash ( key ) = _LOW( n × ( A × key % 1 ) )。
其中,“A × key % 1”表示取 A × key 小数部分,即: A × key % 1 = A × key - _LOW(A × key), 而_LOW(X)是表示对X取下整。
3、平方取中法
由于整数相除的运行速度通常比相乘要慢,所以有意识地避免使用除余法运算可以提高散列算法的运行时间。
平方取中法的具体实现是:先通过求关键码的平方值,从而扩大相近数的差别,然后根据表长度取中间的几位数(往往取二进制的比特位)作为散列函数值。
因为一个乘积的中间几位数与乘数的每一数位都相关,所以由此产生的散列地址较为均匀。
4、数字分析法
设有n 个 d 位数,每一位可能有r 种不同的符号。
这r 种不同的符号在各位上出现的频率不一定相同,可能在某些位上分布均匀些,每种符号出现的几率均等; 在某些位上分布不均匀,只有某几种符号经常出现。
可根据散列表的大小,选取其中各种符号分布均匀的若干位作为散列地址。
5、基数转换法
将关键码值看成另一种进制的数再转换成原来进制的数,然后选其中几位作为散列地址。
6、折叠法
有时关键码所含的位数很多,采用平方取中法计算太复杂,则可将关键码分割成位数相同的几部分(最后一部分的位数可以不同),然后取这几部分的叠加和(舍去进位)作为散列地址,这方法称为折叠法。
7、ELFhash字符串散列函数
ELFhash函数在UNIX系统V 版本4中的“可执行链接格式”( Executable and Linking Format,即ELF )中会用到,ELF文件格式用于存储可执行文件与目标文件。
ELFhash函数是对字符串的散列。
它对于长字符串和短字符串都很有效,字符串中每个字符都有同样的作用,它巧妙地对字符的ASCII编码值进行计算,ELFhash函数对于能够比较均匀地把字符串分布在散列表中。