《数据结构与算法之美》17——哈希算法(一)基本概念与应用

什么是哈希算法

将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法。而通过原始数据映射之后得到的二进制值串就是哈希值。

一个优秀的哈希算法要满足几点要求:

  1. 从哈希值不能反向推导出原始数据(所以哈希算法也叫意向哈希算法);
  2. 对输入数据非常敏感,哪怕原始数据只修改了一个Bit,最后得到的哈希值也大不相同;
  3. 散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小;
  4. 哈希算法的执行效率要尽量高效,针对较长的文本,也能快速地计算出哈希值。
哈希算法的应用

哈希算法的应用有很多,常见的有:安全加密、唯一标识、数据较验、散列函数、负载均衡、数据分片、分布式存储。

应用一:安全加密

说到哈希算法的应用,最先想到的就是安全加密。最常用的哈希算法是MD5和SHA。

没有绝对安全的加密。越复杂、越难破解的加密算法,需要的计算时间也越长。

 

应用二:唯一标识

通过哈希算法对文件进行哈希计算,得到的哈希值作为文件的唯一标识。通过这个唯一标识可以在数据库中快速找到对应的文件。

网盘的秒传功能就是基于这个方法实现的。在上传之前,先计算文件的哈希值,再到数据库中查找,如果找到,就直接提示上传成功。

 

应用三:数据校验

相信大家都用过BT下载软件吧?我们知道,BT下载的原理是基于P2P协议的。从多个机器上并行下载一个2GB的电影,这个电影文件可能会被分割成很多个文件块(比如分成1000块,每块大约2MB)。等所有文件块都下载完成之后,再组装成一个完整的电影文件。

具体的BT协议很复杂,校验方法也有很多,这里说其中一种思路。

通过哈希算法,对1000个文件块分别取哈希值,并且保存在种子文件中。当文件块下载完成后,通过相同的哈希算法,对下载好的文件块逐一对比。如果不同,说明这个文件块不完成或者被篡改了,需要再生产从其他宿主机器上下载这个文件块。

 

应用四:散列函数

散列函数是哈希算法的一种应用,更加看重的是散列的平均性和哈希算法的执行效率。

课后思考

现在,区块链是一个很火的领域,它被很多人神秘化,不过其底层的实现原理并不复杂。其中,哈希算法就是它的一个非常重要的理论基础。你能讲一讲区块链使用的是哪种哈希算法吗?是为了解决什么问题而使用的呢?

  • SHA 256:产生一个256位哈希。这是目前比特币正在使用的。
  • Keccak-256:产生256位哈希,目前由Ethereum使用。
  • CryptoNight:Monero使用的哈希函数。

保证每个区块是唯一标识的、不可逆、无冲突。

原文地址:https://www.cnblogs.com/liang24/p/13255152.html