hash 的特性与运用
通过上文,我们知道,在实践中使用的哈希函数都具备极大范围的输出值,因此,出现哈希碰撞的几率非常低。在这种前提下,我们可以使用哈希函数来做很多的事情
1
哈希表
哈希表是通过 key-value 直接访问数据的一种数据结构。我们把数据关键内容作为输入值,把通过哈希函数得到的输出值作为对应的 key 值映射到表中的一个位置,这样我们就可以具备极快的访问速度,数据量越大,哈希表的访问速度优势就越明显。
例如,在一千万条数据中,其中一条数据如下,
var p = {
name: '张三',
phone: '131111111111',
...
}
phone
是该数据的关键内容
如果这一千万条数据都存在数组中,那么我要找到该数据就必须以 phone
作为匹配条件去遍历查询,这样的耗时可能会很长
如果我存储在哈希表中,那么我只需要以 phone
作为输入值,得到对应的哈希地址,就可以直接访问到该数据的全部内容
这也是为什么在前端项目中,大数量数据存储都尽量使用 Map
2
识别内容变化
在实践中,有的时候直接识别内容的变化可能会比较麻烦。
例如我们前端在按需加载的项目中打包,最终会生成很多个 JS 文件,每个 JS 文件的命名中都会加上一个 hash 值。
app.0dfe0411d4a47ce89c61.js
这个 hash 值的作用之一就是用来快捷判断文件是否发生了变动。当你重复打包的时,我们只需要对比新旧文件的 hash 值,就可以知道是否需要重新打包该文件,从而做到无覆盖更新。
因此,在团队协作中,如果想要每个员工都能够打包代码,那么我通常会禁止团队成员使用代码格式化工具,因为这个工具可能会调整别的代码,从而导致打包结果差异很大
或者也可以统一代码格式化工具,不过这种难度比较大
识别内容变化在区块链中也发挥了关键性作用,区块链的防篡改特性正是哈希函数的功劳。具体细节后续章节中我们会涉及到。
3
加密
哈希函数具备单向性。也就是说,我们可以通过输入值计算出输出值,但是不能通过输出值,反推输入值到底是什么。
Hash(message) -> x
x !-> message
因此,想要通过暴露出来的哈希值反推输入值到底是什么非常困难,只有通过暴力破解的方式不停的去尝试。
因此,有的客户端展示一些敏感信息时,可能不会直接暂时真实信息,而是展示通过处理的 hash 值
当然,这样的加密方式,不适合运用在需要解密的场景
在比特币中,我们经常说的挖矿,就是在做类似暴力破解的事情,试图通过暴力手段不停尝试,直到得到一个符合约定规则的 hash 值。这也是为什么挖矿是一个非常消耗算力的过程
4
sha256
sha256 是比特币中使用的哈希函数。对于任意长度的信息,sha256 都会输出一个 256 位哈希值,它是由美国国安局研发的安全散列算法。
sha256 具备极强的抗碰撞性。到目前为止,世界上最强的超级计算器也不具备人为制造碰撞的能力。当然,如果未来某个时刻技术发展,算力大幅度增强,也不排除有可能可以轻松做到,如果到了这个时候,sha256 就失去了其安全性,比特币也将崩溃
我们可以在网上找到很多在线的 sha256 工具,有兴趣的可以搜索尝试一下
下一章,我们介绍区块链的基础数据结构
相关文章
- git仓库配置及仓库特性
- React团队是如何测试并发特性的
- 【说站】java Map集合的新特性整理
- 【说站】python拼音模块的特性
- 这三大特性,让 G1 取代了 CMS!
- Android7.0新特性
- MySQL 事务特性和事务隔离级别
- Dubbo 高级特性
- JDK 19 最新动态和 JDK 20 新特性预测
- 比PyTorch、TensorFlow更快,MindSpore开源一周年升级巨量新特性
- H5新特性总结详解手机开发
- 滥用Edge浏览器的“恶意站点警告”特性,实现地址栏欺骗
- Oracle内连接改善数据库性能的强势利器(oracle内连接特性)
- Oracle数据库中的高级特性精彩纷呈(oracle中的高级特性)
- 更新的MySQL版本,你需要知道的25个重要特性(MySQL下新版本)
- SQLServer误区30日谈第3天即时文件初始化特性可以在SQLServer中开启和关闭
- MySQL内存表的特性与使用介绍