本文主要是介绍数据结构与算法之美-哈希算法-极客时间学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
‘Hash'音译是’哈希‘,意译是’散列‘。哈希算法不是仅仅应用于我们常用结构哈希表中,哈希算法是一个更加广泛的概念。将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。这里注意任意长度,因为哈希表中通常是把长的变短,但也可以把短的变长。
哈希算法理论上应该满足下列要求:
- 从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法);
- 对输入数据非常敏感,哪怕原始数据只修改了一个 Bit,最后得到的哈希值也大不相同;
- 散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小;
- 哈希算法的执行效率要尽量高效,针对较长的文本,也能快速地计算出哈希值。
哈希算法的用途可以粗略分为下面几类:
1、安全加密
安全加密主要是利用第一个特点不能反向推导,用户输入明文,转化后验证和后台存储的都是密文。这样即使密文被盗也无法破解。另一个就是散列冲突概率要小,是防止密文被暴力破解,用穷举方式去尝试得到相同密文。这里涉及到密码学的一个悖论,越是难以破解的密码,对用户也越难记,对加密算法也越复杂难于计算。
2、唯一标识/数据校验
文件对于用户层面是一个个不同名字的文件,如果出现重名,我们需要打开文件进行比对。而对于计算机,文件是一个个二进制文件,逐个比对太过繁琐。所以可以选取文件其中片段计算散列值,通过散列值来进行快速比较,判断文件是否相同。最普遍的就是网络下载,防止下载出错或者源文件被篡改,会提供一个哈希值给用户来比对。利用的是哈希算法对数据敏感,即使改变稍稍也会产生大不相同的哈希值。
3、散列函数
散列表的散列函数也是典型应用之一,此处散列冲突问题不是首要考虑的。毕竟可以说对于散列表的数据越来越多,散列冲突是必然的,而且有相应的开放寻址法和链表法可以解决。这里的散列算法更加注重运算速度及散列值的分布均匀。
4、负载均衡/数据分片/分布式存储
将IP地址计算哈希值,再与服务器列表的大小取模运算,使得每次都会得到同样的服务器进行响应。其他的类似,都是通过哈希计算后再与资源大小做取模,得到具体数据对应的服务器。
这篇关于数据结构与算法之美-哈希算法-极客时间学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!