一说到哈希算法, 我瞬间就想到了哈希函数、哈希表, 其实他们并非一回事. git
简单来讲, 哈希算法就是将任意长度的字符串经过计算转换为固定长度的字符串, 不对, 不光字符串, 应该说是将任意长度的二进制串转换为固定长度的二进制串, 这个转换的过程就是哈希算法. 算法
既然将任意长度的字符串转换成固定长度的, 那么冲突就不可避免了, 好比将0-100全部的数字, 映射到0-10这十个数字上, 不免会发生冲突. 通常来讲, 计算得出的哈希值越长, 冲突的几率就越低, 好比说, 计算事后, 哈希值为16个字节, 也就是128位, 那么就有2^128个不一样的哈希值, 发生哈希冲突的几率为(1/2)^128, 这个几率能够说很低了. 数据库
以MD5为例, 如下是通过MD5转换后的值: 服务器
朋友你好: 677fe16950241e74ef632efb2b9f92a7负载均衡
朋友你好!: 6efa551df87d9de987f17be4e73eb720分布式
能够看到, 哪怕仅仅差了一个感叹号, 计算后的值也是天壤之别, 因此不少网站上下载文件的同时还提供md5值, 如今可以理解了吧, 你将下载后的文件经过md5算法进行计算, 获得的字符串若是和网站给定的不相同, 说明文件被修改过了. 函数
固然, 哈希算法不只仅只有md5这一种, 以用途来分析哈希算法, 就不说哈希算法的原理了, 由于我不会. 网站
1. 数据校验加密
上面说到的md5就是其中的一个, 好像还有一个什么SHA, 不过我不知道, 也就不展开探讨了. spa
md5能够将一个文件通过计算转换成一个指定长度的字符串, 能够防止文件被篡改, 可是经过加密后的字符串很难逆向推出原文.
前面那个例子能够看到, 即便文件被修改了一点点, 也会致使计算后的值发生很大变换.
2.惟一标识
好比说, 如今有十万个文件, 给你一个文件, 要你在这十万个文件中查找是否存在. 一个很笨的办法就是把每一文件都拿出来, 而后按照二进制串一一进行对比. 可是这个操做注定是比较费时的.
能够用哈希算法对文件进行计算, 而后比较哈希值是否相同. 由于存在哈希冲突的状况, 你能够在相同哈希值的文件再进行二进制串比较.
3.哈希表
在哈希表中使用哈希函数已经并不陌生了, 再也不赘述.
4.负载均衡
好比说, 如今又多台服务器, 来了一个请求, 如何肯定这个请求应该路由到哪一个路由器呢?固然, 必须确保相同的请求通过路由到达同一个服务器. 一种办法就是保存一张路由关系的表, 好比客户端IP和服务器编号的映射, 可是若是客户端不少, 势必查找的时间会很长. 这时, 能够将客户端的惟一标识信息(如:IP、username等)进行哈希计算, 而后与服务器个数取模, 获得的就是服务器的编号.
5.分布式存储
当咱们有大量数据时, 通常会选择将数据存储到多个服务器, 为了提升读取与写入的速度嘛. 决定将文件存储到哪台服务器, 就能够经过哈希算法取模的操做来获得.
可是, 若是数据多了, 要增长服务器了, 问题就来了, 好比原来是10台服务器, 如今变成15台了, 那么原来哈希值为16的文件被分配到编号6的服务器, 如今被分配到编号1的服务器, 也就意味着全部文件都要从新计算哈希值并从新非陪服务器进行存储. 一致性哈希就是这个用途, 能够查找个人历史文章.
暂时我能想到的就只有这些, 固然, 哈希算法的用途还有不少, git中的commit id等, 可是我不太了解, 就伪装没有吧, 嘿嘿
有时对用户的密码进行MD5加密再保存, 确实要比明文保存好的多. 可是, 你觉得经过哈希算法进行加密就万事大吉了么? 很差意思, 并不能, 像前面提到的MD5就已经号称别破解了.
好比, 你将用户的密码进行MD5加密后进行保存, 如有心人拿到你的数据库数据, 虽然获得的是加密后的密码, 可是只要准备一个经常使用密码的字典, 将字典中的密码进行加密后与数据库保存的数据进行比较, 若是相同, 基本上就能够肯定了.
我感受能够对密码进行双层加密, 也就是使用两个不一样的加密算法, 一个算法的输出做为另外一个的输入, 增大一些破解的难度吧.