作者 | Patrick Woodhead

译者 | Shawn

责编 | Aholiab

区块链的发展史,实质上是开发者与哈希函数之间长达十年的情史。

事实上,如果你理解哈希函数,那么理解区块链的挖矿模式和不可篡改性便是一件轻而易举的事情!

哈希函数的应用很广泛,比如每当你在网站上输入密码时,都会用到哈希函数。虽然哈希函数的用途虽然非常简单,但是它的性能却非常强大,在所有与版本控制、安全性和真实性有关的软件中无处不在。

但要明白什么是哈希函数并不容易,虽然解释的资料很多,但要么过于专业晦涩难懂,要么枯燥无味

因此,在这篇文章中,营长会用一种大白话的方式让你理解哈希函数的本质,并且通过emoji表情,形象的让你秒懂哈希函数背后的内含

哈希函数是什么?


哈希函数在近年来的技术进步中发挥着非常重要的作用。哈希函数是什么?它的工作原理是什么?我认为我们都应该至少有个基本的了解。

网上有很多关于哈希函数的解释,这些解释要么晦涩难懂,要么枯燥无味。

其实,我们可以把哈希函数想象成一个emoji工厂,工厂接收一行一行的emoji,但它接受的emoji只有猕猴桃、菠萝、茄子、辣椒、胡萝卜和玉米

emoji工厂接受和输出的6种emoji

输入的emoji被工厂处理后,输出的也只是一行行上述emoji。

这个emoji工厂之所以特别,有以下几个原因。

1. 工厂返回的emoji要比它接收的emoji


每次,工厂都会从以上6个emoji选项中选出8个emoji(每种emoji可以多选)。然后,处理这些emoji并返回一行emoji(3个),这些emoji也是从上面的6种emoji中选出来的。

重点是,它输出的emoji比接收的emoji少(8个变成3个)。

Emoji哈希工厂

2. 对于相同的输入,工厂总是返回相同的输出


如果你把8个emoji以相同的排列顺序送入工厂两次,那么工厂两次都将以相同的顺序返回3个emoji。

也就是说,这个工厂具有确定性。这一点,从上面的动图中也可以看出,对于相同的输入,工厂每次都会返回相同的输出。

3. emoji工厂是一条单向通道


如果你输入一行8个emoji,工厂就会立即返回一个输出。但是,如果我将工厂输出的3个emoji告诉你,但是不告诉你对应的输入是什么,你是无法通过分析工厂和输出来推导出输入的。实际上,要想找出输入,最快的方法是试错

换句话说,要想找出某个输出对应的输入,最快的方式就是随机输入不同的emoji组,直到找到正确的那组。

而且,你甚至可以在工厂里走一走,观察它的实际运作方式,但你仍然不能根据输出求解或逆向推导出输入。这是一个严谨的单向工厂。

也许你还是有点云里雾里,那么我们不妨以做蛋糕为例,如果我给你制作蛋糕所需的配料和一个详细的配方,你只要依照配方使用这些配料,马上就能做出一个蛋糕。

假如我让你用同样的配料和配方再做一次,你很快就会做出一个相同的蛋糕。蛋糕的烘焙同理。但是,如果我给你的是蛋糕和配方,而配方不包含配料用量,只包含烘培步骤,你就很难计算出这个蛋糕的确切配料用量。

这种情况下,用不同的蛋糕配料用量进行试错或许是最好的方法。

这样,我们再来看一下emoji的属性。

4. 只改变输入中的一个emoji,也会得到完全不同的输出


在做蛋糕这个类比中,通过一次又一次的试错,你可能会越来越接近正确的配料用量。但是对于 emoji 表情工厂来说,哪怕只对输入作出细微的改变(只改变一个emoji),就会得到完全不同的输出。


以上面的动图为例,如果将输入中第一个茄子换成胡萝卜,那么得到的输出就会是完全不同的3个emoji。

这就意味着在给定输出的情况下,无法通过不断试错「逐步逼近」正确的输入。只能随机尝试不同的emoji组合,直到碰巧发现正确的输入为止。

区块链挖矿本质上就是通过计算机不断地进行试错来找到输入,这个输入经过emoji工厂的处理能够返回带有某个特性的输出,例如,以两个茄子开头的输出。

5. 要找到某个输出所对应的两个输入,最快的方法就是试错


看到这,你一定会问:等等,如果输出比输入短,那么每个输出肯定会对应多个输入吧?

说的很对。如果你将 8 个emoji放入工厂,只得到3个emoji ,那么一个输出必定对应多个输入。

但是,emoji工厂的设计太妙了,即使你知道某个输出对应的输入之一,找出其余输入的最快方法仍然是试错法。

换句话说,要找到一个输出对应的两个输入,最快的方法就是试错,直到发生「碰撞」为止。

哈希函数的应用


在说哈希函数的实际应用之前,我们先简单对上面提到的五个哈希函数的属性做个总结。

  1. 工厂接收8个emoji并且返回3个emoji;(压缩性)

  2. 相同的输入总是返回相同的输出;(确定性)

  3. 轻微改变输入会导致输出完全不同;(分散性)

  4. 给定一个输出,试错是计算对应输入的最快方法;(单向性)

  5. 试错是找到同一个输出对应的两个不同输入的最快方法。(抗碰撞性)

在哈希函数中,这些特性之所以很重,我们不妨通过实际的应用来看看。

假设你的密码由8个emoji组成。每当你在网站输入密码时,网站存储的不是你的密码,而是你密码的 “哈希值”(即:密码经过emoji工厂处理之后输出的3个 emoji)。

这样一来,如果出现数据泄露或者有人窃取到该网站存储的个人数据,那么窃取者得到的只是一堆哈希值,而非实际的密码!

由于工厂是单向的,如果窃取者想根据哈希值逆向计算出实际的密码,唯一的方法就是试错。

由于你的密码由8个emoji组成(从6种不同的emoji中选出),窃取者可能不用花很长时间就可破解你的密码。

但在实际生活中,可选作密码的字符串集合要大得多,这就意味着可能的输入也要多得多。而且,实际生活中哈希工厂/函数的输出的长度也远远长于3个字符。

因此在现实中,窃取者要花费很多很多年的时间才能根据哈希值算出对应的密码!

虽然这依然存在数据泄露的风险,但并不影响你重新登录网站,你知道自己的密码,直接输入就好。

这时,你输入的密码会立即由哈希工厂转化成一个哈希值。网站可以立刻检查这个哈希值是否与你的账户名所对应的哈希值匹配,因为哈希工厂总是返回相同的输出(确定性),然后网站就会允许你登陆。

但是密码长度不一定都是8emoji那么长,如果我想对一行更长的emoji表情进行哈希计算呢?

没有问题!通过这项由Ralph Merkle和Ivan Damgård两位密码学专家提出的简单技术,任意长度的emoji组合经过「哈希计算」都可以被转化成仅由3个emoji 表情组成的哈希值。

Merkle-Damgård架构

具体怎么实现呢?

如果给定一个长度更长的emoji组合,我们可以创建一组工厂来处理它。具体步骤如下:

  1. 先对这行emoji进行分段,前8个emoji作为第一段,之后每5个emoji为一段来进行分段(如果最后一段不够5个emoji,可以使用额外的emoji进行填充,不过这个额外填充技术要求较高,所以我们先假设这行emoji是可以完美分段的);

  2. 将第一段emoji输入第一个工厂;

  3. 得到一个由3个emoji组成的输出,将这个输出与第二段emoji放在一行一起输入第二个工厂;

  4. 不断重复这个过程,直到这行emoji表情组全部经过工厂处理。

  5. 将最后一个工厂的输出返回。

这样我们就把更长的emoji组转化成3个emoji了!

那么,既然现在输入的长度问题解决了,那么找到输出相同(一次碰撞)的两行输入会容易得多吗?


你可能直觉上会这么认为。但是,实际上并非如此。就像在一家工厂中找到「一次碰撞」一样困难。

原因在于,假设除了试错之外,还有某种方法可以找到输出相同的两行较长的emoji组合输入(一次碰撞)。

那么,在某个实行Merkle-Damgård架构的工厂中,你输入两行不同的emoji组合,这个工厂将返回相同的输出。但是,这意味着你使用试错法之外的方法找到了一次碰撞,这就与上文中的假设相矛盾了,因为我们假设每个工厂都具有抗碰撞性!

所以,通过增设工厂和数学推理,我们创造了一种方法,可以将任意长度的emoji组合处理成3个emoji。

更重要的是,即使某人知道一个由3个emoji组成的输出,也没有比试错法更快的方法可以用来计算出任意长度的对应输入。鉴于现实世界的哈希计算存在太多组合,试错可能会花费许多年!

有了这个简单的原理,你就可以将自己的emoji密码设置成任意长度,其安全性不会受影响(当然前提是假设一个emoji表情工厂是抗碰撞的)。

哈希函数与区块链

那么哈希函数是怎样应用在区块链上的呢?想象一下,你有一个文档(满是emoji),里面描述的可能是关于一笔金融交易。你要向人们证明这个文档在某个确切的时刻处于某个确切的状态(确切到最后一个emoji)。

你可以将整个文档放入使用Merkle-Damgård架构的哈希工厂中,将输出结果通过电子邮件发送给100个人。

由于这个工厂是单向的,所以邮件接收者无法读出文档的原始内容。如果未来有人声称你的文档是假的,或者你篡改了文档,你就可以证明在你把这个文档发送给去中心化的社区时,这个文档处于某个确切的状态(确切到最后一个emoji或字母)。

因为哈希工厂是抗碰撞的,人们自然会相信你不是骗子!

了解真正的哈希函数

哈希函数的「单向性」和「抗碰撞性」是非常强大的,这两个特性正在随着区块链的发展改变整个技术世界。

但是emoji工厂/哈希函数内部到底是如何运作呢?这就要牵扯到很多技术细节了。实际上,如果你确信上述特性成立,那么工厂的内部运作就无关紧要了。哈希函数的特性比它们的内部运作更有趣(除非你是数学家或密码学家)。

真正的哈希函数接受的是十六进制字符串(而不是六进制emoji字符串)。十六进制字符串仅由 “0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f” 十六个字符组成。哈希函数接受任意长度的输入,并且返回64个十六进制字符。有时,为了增强安全性,会返回128个十六进制字符。SHA-256是一种普遍使用的哈希函数。

怎么样,读了这篇文章相信你对哈希函数有了不一样的认识了吧?这么好的科普文,欢迎转发给更多需要的小伙伴。

赠人玫瑰,手有余香。???


— END —

扫码报名 | 免费技术公开课

EOS工作原理 | EOS开发环境 | 智能合约 | DAPP开发

推荐阅读:

  • 被V神点赞, 我是如何用五子棋打败以太坊排名最高的应用的? |人物志

  • 打打游戏就能在北京二环买套房?区块链大神说:你能靠VR刷怪升级还房贷!

  • 骗局翻新, 暗网活跃度倍增, 2018加密货币犯罪报告敢看吗?

  • 京东末位淘汰 10% 高管 ;聊天宝惊现大 Bug:用户可提现百万;斗鱼回应“人去楼空” | 极客头条

  • 华为立 Flag:一年超越三星做全球智能手机老大!

  • “安利”一款debug神器:在AI面前,bug都不是事儿

  • 那些简历造假拿 Offer 的程序员,后来都怎么样了?

  • 这可能是史上最全的Python算法集!

点击“阅读原文”,打开 APP 获取更多干货哟!

好文!点「好看」哟~

5个emoji表情包,让你秒懂哈希函数!相关推荐

  1. markdown中快速插入Emoji表情包语法速查表!!!

    markdown中快速插入Emoji表情包语法速查表!!!

  2. CSS雪碧图制作emoji表情包

    效果图: 原理:利用雪碧图,来实现emoji表情包,减少图片请求数. 表情包转换为文字 & 文字转换为表情包 维护两个对象来实现. 缺点:表情包大小由雪碧图中表情包大小控制,不能更改. htm ...

  3. Emoji-Chat emoji表情包发送及显示兼容web端、移动端

    Emoji-Chat emoji表情包发送及显示兼容web端.移动端 序言 在如今聊天表情包满天飞的当下,聊天过程中想发送个表情感慨一下情绪在所难免,当下我就遇到这么个需求,希望在web端聊天室中可以 ...

  4. js文本内去除emoji表情包

    利用正则匹配emoji表情包并且去除 let Arr=['emoji

  5. linux版微信 能发表情包的,仿微信在对话框文字中插入Emoji表情包

    场景 类似于微信聊天的一个对话框,要求可以使用EMOJI表情,对话框是一个div,通过改变contentEditable属性使得内容可以编辑. 问题 Emoji表情在页面中其实是GIF格式的IMG标签 ...

  6. 前端emojs_Emoji-Chat emoji表情包发送及显示兼容web端、移动端

    序言 在如今聊天表情包满天飞的当下,聊天过程中想发送个表情感慨一下情绪在所难免,当下我就遇到这么个需求,希望在web端聊天室中可以发送表情,还得在web端.微信H5.app端.微信公众号里均可以正常显 ...

  7. php文本框添加表情,仿微信在对话框文字中插入Emoji表情包

    场景 类似于微信聊天的一个对话框,要求可以使用EMOJI表情,对话框是一个div,通过改变contentEditable属性使得内容可以编辑. 问题 Emoji表情在页面中其实是GIF格式的IMG标签 ...

  8. vue 使用emoji表情包

    1.前端页面 vue <template><div class="test"><div v-show="show" :class= ...

  9. 仿微信在对话框文字中插入Emoji表情包

    场景 类似于微信聊天的一个对话框,要求可以使用EMOJI表情,对话框是一个div,通过改变contentEditable属性使得内容可以编辑. 问题 Emoji表情在页面中其实是GIF格式的IMG标签 ...

最新文章

  1. 计算机应用 含升学方向,对口升学《计算机应用基础》复习资料总汇(含答案))讲述.doc...
  2. clickhouse修改时区
  3. httpurlconnect设置中文参数_CNC数控机床三菱系统参数的设置及报警解除
  4. 最适合编程的10大字体推荐
  5. UITableViewCell在非Nib及Cell重用下设置CellStyle
  6. Spring Cloud微服务之Feign服务调用(十一)
  7. django自定义模板标签,通过键获取字典的值,屏蔽姓名等隐蔽信息并调用展示到页面上
  8. angular 实现modal windows效果(即模态窗口,半透明的遮罩层),以及bootstrap(css,components,js)的初步学习...
  9. 360优化开机速度后慢了_提高电脑开机速度的优化技巧
  10. 深入理解java:1.1. 类加载器
  11. 百度开源超级链技术方案!
  12. 利用caffe的Python接口生成prototxt文件
  13. mysql 中like怎么用_mysql中like怎么用?
  14. Unity WebGL Input输入中文
  15. PHP腾讯云短信接口
  16. 作为架构师该如何面对系统和业务的复杂性?
  17. Java扫码点餐小程序源码 SaaS系统源码 微信、支付宝扫码点餐小程序源代码
  18. 深度解析大快DKadoop大数据运维管理平台功能
  19. 关于多个债权人申请执行同一被执行人的清偿顺序问题
  20. 出圈问题(java)-----n个人围成一圈,数到key或者key的倍数,出圈,问剩下的最后一个人原来的位置是多少?

热门文章

  1. Export MODO file for MAYA
  2. C--排序算法:shell排序、快速排序
  3. linux modprobe 和 insmod
  4. 中继器·集线器·网桥·交换机·路由器·网关的区别
  5. linux内核志愿者,新闻|Linux 中国志愿者翻译小组 LCTT 三岁啦!
  6. 机械硬盘大比拼,矿工必看
  7. 通过代码来申请CA证书 -- cnblog
  8. 微信域名(旅游景点、美食节、灯光节、庙会等宣传文案)如何防封?
  9. java pecs_JAVA的PECS原则
  10. 无限火力更新服务器公告,英雄联盟无限火力官网公告2021?无限火力怎么玩?...