hash 算法
提到hash,相信大多数同学都不会陌生,之前很火现在也依旧很火的技术区块链背后的底层原理之一就是hash,下面就从hash算法的原理和实际应用等几个角度,对hash算法进行一个讲解。
1、什么是Hash
Hash也称散列、哈希,对应的英文都是Hash。基本原理就是把任意长度的输入,通过Hash算法变成固定长度的输出。这个映射的规则就是对应的Hash算法,而原始数据映射后的二进制串就是哈希值。活动开发中经常使用的MD5和SHA都是历史悠久的Hash算法。
echo md5("这是一个测试文案");
// 输出结果:2124968af757ed51e71e6abeac04f98d
在这个例子里,这是一个测试文案
是原始值,2124968af757ed51e71e6abeac04f98d
就是经过hash算法得到的Hash值。整个Hash算法的过程就是把原始任意长度的值空间,映射成固定长度的值空间的过程。
2、Hash的特点
一个优秀的hash算法,需要什么样的要求呢?
-
a)、从hash值不可以反向推导出原始的数据
这个从上面MD5的例子里可以明确看到,经过映射后的数据和原始数据没有对应关系 -
b)、输入数据的微小变化会得到完全不同的hash值,相同的数据会得到相同的值
echo md5("这是一个测试文案"); // 输出结果:2124968af757ed51e71e6abeac04f98d echo md5("这是二个测试文案"); // 输出结果:bcc2a4bb4373076d494b2223aef9f702
可以看到我们只改了一个文字,但是整个得到的hash值产生了非常大的变化。
-
c)、哈希算法的执行效率要高效,长的文本也能快速地计算出哈希值
-
d)、hash算法的冲突概率要小
由于hash的原理是将输入空间的值映射成hash空间内,而hash值的空间远小于输入的空间。根据抽屉原理,一定会存在不同的输入被映射成相同输出的情况。那么作为一个好的hash算法,就需要这种冲突的概率尽可能小。
</