什么是哈希算法
将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法。而通过原始数据映射之后得到的二进制值串就是哈希值。
一个优秀的哈希算法要满足几点要求:
- 从哈希值不能反向推导出原始数据(所以哈希算法也叫意向哈希算法);
- 对输入数据非常敏感,哪怕原始数据只修改了一个Bit,最后得到的哈希值也大不相同;
- 散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小;
- 哈希算法的执行效率要尽量高效,针对较长的文本,也能快速地计算出哈希值。
哈希算法的应用
哈希算法的应用有很多,常见的有:安全加密、唯一标识、数据较验、散列函数、负载均衡、数据分片、分布式存储。
应用一:安全加密
说到哈希算法的应用,最先想到的就是安全加密。最常用的哈希算法是MD5和SHA。
没有绝对安全的加密。越复杂、越难破解的加密算法,需要的计算时间也越长。
应用二:唯一标识
通过哈希算法对文件进行哈希计算,得到的哈希值作为文件的唯一标识。通过这个唯一标识可以在数据库中快速找到对应的文件。
网盘的秒传功能就是基于这个方法实现的。在上传之前,先计算文件的哈希值,再到数据库中查找,如果找到,就直接提示上传成功。
应用三:数据校验
相信大家都用过BT下载软件吧?我们知道,BT下载的原理是基于P2P协议的。从多个机器上并行下载一个2GB的电影,这个电影文件可能会被分割成很多个文件块(比如分成1000块,每块大约2MB)。等所有文件块都下载完成之后,再组装成一个完整的电影文件。
具体的BT协议很复杂,校验方法也有很多,这里说其中一种思路。
通过哈希算法,对1000个文件块分别取哈希值,并且保存在种子文件中。当文件块下载完成后,通过相同的哈希算法,对下载好的文件块逐一对比。如果不同,说明这个文件块不完成或者被篡改了,需要再生产从其他宿主机器上下载这个文件块。
应用四:散列函数
散列函数是哈希算法的一种应用,更加看重的是散列的平均性和哈希算法的执行效率。
课后思考
现在,区块链是一个很火的领域,它被很多人神秘化,不过其底层的实现原理并不复杂。其中,哈希算法就是它的一个非常重要的理论基础。你能讲一讲区块链使用的是哪种哈希算法吗?是为了解决什么问题而使用的呢?
保证每个区块是唯一标识的、不可逆、无冲突。