Hash算法的简介与使用
CoderTh 结丹

Hash算法的简介与使用

Hash算法是什么

如果用一句话来总结哈希的话,其实就是将目标文本装欢成一个拥有相同长度的并且不可逆转的字符串。而我们平常熟知的加密算法,是将目标文本转换成一个不同长度并且可逆的秘闻,所以从严格意义上来讲的话,hash不算事加密算法,因为其不可逆转。这里所说的不可逆指的是即不可以将转换后的结果逆转成原文,也指两次输入,即使转换结果相同也不能够说两次输入就一定相同。

Hash算法的特点

  • 固定长度。散列函数可以接受任意大小的数据,并输出固定长度的散列值。比如MD5这个hash函数为例,不管原始数据有多大,计算得到的hash散列值总是128比特

  • 雪崩效应。原始数据哪怕只有一个字节的修改,得到的hash值都会发生巨大的变化。

  • 单向。只能从原始数据计算得到hash值,不能从hash值计算得到原始数据。所以散列算法不是加密解密算法,加密解密是可逆的,散列算法是不可逆的。

  • 避免冲突。几乎不可能找到一个数据和当前计算的这个数据计算出一样的hash值,因此散列函数能够确保数据的唯一性。目前标准的MD5算法理论碰撞概率是2的128次方分之一。正是因为这种算法的碰撞概率很小,所以说我们在实际使用的过程之中才是可以无视这个数而直接使用MD5数据确定唯一性。

    Hash算法使用场景

    1、场景一:安全加密

    日常用户密码加密通常使用的都是 md5、sha等哈希函数,因为不可逆,而且微小的区别加密之后的结果差距很大,所以安全性更好。

    2、场景二:唯一标识

    比如 URL 字段或者图片字段要求不能重复,这个时候就可以通过对相应字段值做 md5 处理,将数据统一为 32 位长度从数据库索引构建和查询角度效果更好,此外,还可以对文件之类的二进制数据做 md5 处理,作为唯一标识,这样判定重复文件的时候更快捷。

    3、场景三:数据校验

    比如从网上下载的很多文件(尤其是P2P站点资源),都会包含一个 MD5 值,用于校验下载数据的完整性,避免数据在中途被劫持篡改。

    4、场景五:散列函数

    前面已经提到,PHP 中的 md5、sha1、hash 等函数都是基于哈希算法计算散列值

    5、场景五:负载均衡

    对于同一个客户端上的请求,尤其是已登录用户的请求,需要将其会话请求都路由到同一台机器,以保证数据的一致性,这可以借助哈希算法来实现,通过用户 ID 尾号对总机器数取模(取多少位可以根据机器数定),将结果值作为机器编号。

    6、场景六:分布式缓存

    分布式缓存和其他机器或数据库的分布式不一样,因为每台机器存放的缓存数据不一致,每当缓存机器扩容时,需要对缓存存放机器进行重新索引(或者部分重新索引),这里应用到的也是哈希算法的思想。

 Comments