这个想法源自@Bintou 的一个实验作业,最近复习/搬砖之余在研究前端相关的东西,弄完作业之后,想到 HTML5 有一个可以实现本地文件读取的 File API,突发奇想,或许我可以利用它做个在线计算 Sha-3 哈希的网页?也可以顺便看看这东西在 Web 端的可用性如何。
元旦假期的时候,花了一天时间做了个简单的小网页,当然,核心的哈希算法是调用别人写好的库(一天时间把函数写好还没有BUG,以我自己现在的功力大概还做不到)。为了创造能调这个库的环境,还是费了蛮大的劲。在熟悉API的过程中,看了一堆文档,也踩了不少细节的坑,总算是做了个雏形。(总结起来很多琐碎细节,拖到现在才写好笔记)
网站演示:https://zgq354.github.io/sha3/
踩坑记录:https://blog.izgq.net/archives/1260/
性能方面,这个网页在我的小机器的 Chrome 71 哈希的速度大概在 20MB/s 左右,2G的文件拖进去执行大概需要两分钟(移动端估计会慢好多)。
实现的过程中主要的重点在于通过现有的 API 实现一个类似 C++ 的 fstream 的文件流读取的机制,由于浏览器的JS是单线程的,所以在这个环境中还有蛮多问题,类似如何减少JS计算过程对页面的阻塞、主页面的 JS 与 Web Worker 的 JS 环境之间通信之类的接口的各种细节问题等等。
在查文档的时候,看到 WHATWG 组织的文档对 Stream 的定义 也是十分完善,发现,即使是网页开发,系统底层相关的东西涉及的只会越来越多。也许,在未来,客户端开发的很多元素会慢慢地搬到 Web 上来,就不只是照着设计稿写写 HTML 那么简单了。
做完之后发现,写那个 sha3-js 库的大佬其实早就把这一块的整套流程研究了一遍,还把各种常用哈希算法,编码函数等都打包起来,做成了一个全能的在线工具,从使用者的角度来说还是可以参考一下(发现在页面设计上我写的网页与作者的很多元素都不谋而合了?)
https://emn178.github.io/online-tools/
不得不说,写代码的过程中,默念一下CSAPP相关的内容,有奇效。