哈希函数
也叫散列函数,一般是输入一个字符串或基本数据类型经过哈希函数得到一个唯一的固定位数的散列值。
哈希函数的特点
1,经典哈希函数输入域可以是无穷大的(比如字符串,以及常见的对象)
2,输出域一般是有穷的
3,一个输入参数多次调用同一个哈希函数得到的结果是一样的
4,会有两个参数的哈希值对应同一个哈希值,这个时候我们称发生了哈希碰撞
5,这是很重要的性质:多个输入参数输入哈希函数后,它们的返回值分布是趋向均匀的,也是哈希函数的离散型
如下图所示,这是这些文件的哈希码,我们一般用这个来检验我们下载下来的软件是否被篡改了:
SHA-256:表示算法返回的哈希值为256位。可以用以下代码来算哈希值进而确定我们从网络下载下来的软件是否是被篡改了。
1 | certutil -hashfile jdk-12.exe SHA256 |
得到的哈希值如下:
这个哈希值和我们在jdk官网显示出的一样,说明我们的文件并没有被篡改。
同样对于.zip文件也得出一个哈希码,和官网的一样。且在命令行多次调用该方法得到的哈希码都是一样的(当然前提是文件没有被改动,只修改文件名不会有影响)
!(/picture/QQ截图20190511180627.png)
一个小技巧:可以用一个哈希函数可以改出很多个哈希函数,并且它们还是相互独立的。相互独立的意思是一个哈希函数修改后的函数的规律不会和原哈希函数有关。方法是:把得到的哈希值劈成两半,把前128位数作为哈希函数1,后128位作为哈希函数2(即假设原来的哈希函数返回值有256位),得到h1和h2后,我们可以 使 h3 = h1 + 1 * h2,这样得到h3这个新的哈希函数。h4 = h1 + 2 * h2, h5 = h1 + 3 * h2,以此类推可以得到多个相互独立的哈希值(然后它们对应相应的哈希函数)。甚至仅仅改变系数就可以得到很多个不同的哈希函数。
哈希表
定义:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。(来自百度百科)
1 |