数据结构与算法之美 | 学习笔记17 —— 哈希算法(散列函数)应用

一、哈希算法

哈希算法需要满足的几点要求:

  1. 从哈希值不能反向推导出原始数据(所以也叫单向哈希算法);(重要)
  2. 即使原始数据发生很小改变,得到的哈希值大不相同;
  3. 散列冲突的概率小;(重要)
  4. 算法执行效率高效,对较长的文本,也能快速计算出哈希值;

例如,MD5算法的哈希值是128位的Bit长度,对任何长度的文本都会得到相同的哈希值:

MD5("今天我来讲哈希算法") = bb4767201ad42c74e650c1b6c03d78fa
MD5("jiajia") = cd611a31ea969b908932d44d126d195b

对于非常相似的两个文本,得到的哈希值也大不相同:

MD5("我今天讲哈希算法!") = 425f0d5a917188d2c3c3dc85b5e4f2cb
MD5("我今天讲哈希算法") = a1fb91ac128e6aa37fe42c663971ac3d

并且,例如将4000多个汉字的文字转换成哈希值,用时不到1ms。

二、哈希算法应用

1. 应用一:安全加密

常用的安全加密算法是MD5(MD5 Message-Digest Algorithm, MD5消息摘要算法)和SHA(Secure Hash Algorithm, 安全散列算法),除此之外,还有DES(Data Encryption Standard,数据加密标准),AES(Advanced Encryption Standard, 高级加密标准)。
因为哈希值长度固定有限,哈希算法无法做到完全没有散列冲突。并且越难破解的加密算法,需要的计算时间越长,在开发时要做权衡。

2.应用二:唯一标识

对于对象比较大的数据,例如相同图片的对比,可以:

  1. 先生成信息摘要(每个图片前中后各取100个字节);
  2. 通过哈希算法得到哈希值;
  3. 最后比较哈希值来初步判断照片在图库中是否存在;
  4. 针对相同哈希值的图片进行全量比较。

3.应用三:数据校验

对于例如迅雷的BT软件,BT的下载原理是基于P2P协议的,从多个机器上下载电影,这个电影文件会被分为很多文件块来下载,最后再拼成一个完整文件。
为了保证文件的安全、正确和完整,可以对每个文件块取哈希值,保存在种子文件中,当文件块下载完成后再通过相同的算法,进行比对。

4. 应用四:散列函数

相比较其他的应用,散列函数对于哈希算法冲突的要求低很多,出现冲突可以通过开放寻址法或链表法来解决。
同时,散列函数对算法是否能反向解密也不关心,但更关心计算出的值是否能平均分布,均匀插入每个槽中。散列算法也追求高效。

你可能感兴趣的:(数据结构)