hash 的特性与运用

简介: 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 工具,有兴趣的可以搜索尝试一下


下一章,我们介绍区块链的基础数据结构

相关文章
|
6月前
|
存储 索引
什么是哈希表?它的工作原理是什么?
在我们的日常生活中,我们经常需要存储和查找各种信息,这些信息可能是电话号码,地址,或者是商品的价格等等。这些信息的存储和查找,就像是我们在一个巨大的仓库中存放和寻找物品。这个仓库就是数据结构,而其中一个最常用的,也是最高效的数据结构就是哈希表。
97 2
|
4月前
|
SQL 关系型数据库 索引
哈希(hash)比树(tree)更快,索引结构为什么要设计成树型?
哈希(hash)比树(tree)更快,索引结构为什么要设计成树型?
|
6月前
|
JavaScript 算法
v-for中key的原理和作用
为什么在使用v-for循环渲染列表时,应始终为每个列表项提供一个唯一的key属性? `使用v-for时加上key属性是为了提高渲染列表时的性能和效率。`
|
6月前
|
存储 NoSQL Redis
Redis(三)存储原理与数据模型(hash冲突、渐进式rehash)
Redis(三)存储原理与数据模型(hash冲突、渐进式rehash)
148 0
|
存储 算法 安全
Hash 算法详细介绍与实现 (二)
书接上回,昨天写了第一部分,《Hash 算法详细介绍与实现 (一)》详细介绍了Hash表和Hash算法的相关概念以及算法的基本原理。同时简单介绍几种hash算法的实现:直接取余法和乘法取整法;本文接着详细唠唠Hash算法和Hash表这个数据结构的具体实现以及Hash算法和Hash表常见问题的解决方案,比如解决Hash表的冲突问题等等.相关的理论知识已在上篇文章详细介绍,这里就不再赘述,多的不说少的不唠,直接进入今天的主题:利用Hash算法实现Hash表
483 1
趣谈哈希表优化:从规避 Hash 冲突到利⽤ Hash 冲突
导读: 本文从哈希表传统设计与解决思路入手,深入浅出地引出新的设计思路:从尽量规避哈希冲突,转向了利⽤合适的哈希冲突概率来优化计算和存储效率。新的哈希表设计表明 SIMD 指令的并⾏化处理能⼒的有效应⽤能⼤幅度提升哈希表对哈希冲突的容忍能⼒,进⽽提升查询的速度,并且能帮助哈希表进⾏极致的存储空间压缩。
|
存储 算法 数据安全/隐私保护
Hash 的定义
Hash,一般翻译做散列、杂凑,或音译为哈希。
146 0
|
存储 算法 Java
Hash 冲突 | 学习笔记
快速学习 Hash 冲突。
|
存储 算法 安全
什么是 Hash 算法?
散列算法(Hash Algorithm),又称哈希算法,杂凑算法,是一种从任意文件中创造小的数字「指纹」的方法。与指纹一样,散列算法就是一种以较短的信息来保证文件唯一性的标志,这种标志与文件的每一个字节都相关,而且难以找到逆向规律。因此,当原有文件发生改变时,其标志值也会发生改变,从而告诉文件使用者当前的文件已经不是你所需求的文件。
什么是 Hash 算法?
|
存储 算法
Hash 算法有哪些?
Hash 算法有哪些?
199 0
Hash 算法有哪些?