分享一个用 WebAssembly 实现的超快在线文件 hash 校验工具 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
jethroX
V2EX    分享创造

分享一个用 WebAssembly 实现的超快在线文件 hash 校验工具

  •  1
     
  •   jethroX 2024-04-01 09:46:37 +08:00 1901 次点击
    这是一个创建于 558 天前的主题,其中的信息可能已经有所发展或是发生改变。

    吃过下载的 win10 镜像损坏的亏,从此以后下载大文件必校验,因为用得少,每次都得重新搜命令,搜索到的在线校验网站处理这种大文件慢的要死,所以自己用 rust 编译了一个 wasm 来处理大文件,速度一下子就起来了。

    校验 win11 镜像跟命令行的速度差不多,支持 MD5 、SHA256 、SHA1 、SHA512 计算。

    网站地址:https://hash.jethro.fun/

    服务器和域名长期有效,欢迎保存为书签。

    22 条回复    2024-04-01 19:03:35 +08:00
    menglizhi2333
        1
    menglizhi2333  
       2024-04-01 10:00:38 +08:00
    好工具, 收藏了
    lstz
        2
    lstz  
       2024-04-01 10:10:19 +08:00 via Android
    感谢分享,想请问这个会吃内存吗?刚刚试了一下好像页面卡住了
    jethroX
        3
    jethroX  
    OP
       2024-04-01 10:34:09 +08:00   1
    @lstz 应该不会很吃内存,他是流式处理的,将文件一块一块的读取到内存里计算,一块 50M 大小。可能稍微大了点,你是用的什么设备?
    lstz
        4
    lstz  
       2024-04-01 10:43:53 +08:00 via Android
    @jethroX 那可能是我的备用机性能太古董了,感谢大佬
    jethroX
        5
    jethroX  
    OP
       2024-04-01 10:48:42 +08:00   1
    @lstz 嘿嘿,我写的时候确实没考虑兼容问题,因为用到了 WebWorkers 和 WebAssembly ,所以需要新一点的浏览器内核。
    cat
        6
    cat  
       2024-04-01 10:54:27 +08:00
    @jethroX 话说,分块读入,那怎么 hash 整个文件呢(真不懂
    Yanlongli
        7
    Yanlongli  
       2024-04-01 10:58:28 +08:00
    不错,收藏了
    jethroX
        8
    jethroX  
    OP
       2024-04-01 11:09:34 +08:00   1
    @cat 这些散列算法本身就是一块一块的算的,只是应用层面看起来是一起计算的整个文件。
    cat
        9
    cat  
       2024-04-01 11:22:45 +08:00
    @jethroX 原来是这样,感谢
    mxT52CRuqR6o5
        10
    mxT52CRuqR6o5  
       2024-04-01 11:28:40 +08:00
    用 web crypto api 应该比 wasm 快吧(不过算不了 md5 )
    jethroX
        11
    jethroX  
    OP
       2024-04-01 13:14:35 +08:00
    @mxT52CRuqR6o5 速度上和 wasm 比不会像和 js 比那么大差异,而且看了下接口,没看到流式处理的 api ,总不能把十多个 G 的文件直接读进内存丢过去计算吧。
    mxT52CRuqR6o5
        12
    mxT52CRuqR6o5  
       2024-04-01 14:30:23 +08:00
    @jethroX #11 js 慢主要是大多数的 js 库写的太烂了,我试了一个 600M 的文件算 md5 ,web crypto api 用 600ms ,你这个 wasm 用 2600ms ,fast-sha256 用 3200ms
    mxT52CRuqR6o5
        13
    mxT52CRuqR6o5  
       2024-04-01 14:30:43 +08:00
    @mxT52CRuqR6o5 #12 打错了,是算 sha256 不是算 md5
    mxT52CRuqR6o5
        14/div>
    mxT52CRuqR6o5  
       2024-04-01 14:36:01 +08:00   1
    我试了下 nodejs 的 crypto 的 polyfill ,性能好像也不错
    我记得好像说是 wasm 的 jit 和 js 的 jit 是一个引擎,理论上花时间去优化 js 能和 wasm 差不多性能(不考虑一些 wasm 特殊指令的话)
    jethroX
        15
    jethroX  
    OP
       2024-04-01 15:49:15 +08:00
    @mxT52CRuqR6o5 我不认为能优化到 wasm 这种程度,就拿计算斐波那契数列来说,这么简单的计算函数,js 和 wasm 的 jit 是一个引擎,那他们速度应该接近吧,可实际计算出来还是有几倍的差距。而且 web crypto api 的实现一定不是用 js 写的。
    mxT52CRuqR6o5
        16
    mxT52CRuqR6o5  
       2024-04-01 15:52:13 +08:00
    @jethroX #15 jit 是一个引擎这件事我也是听说的,斐波那契数列这个性能差距有 benchmark 可以看看吗?
    web crypto api 肯定不是 js 写的,可以认为性能等同于 native
    jethroX
        17
    jethroX  
    OP
       2024-04-01 15:57:03 +08:00
    @mxT52CRuqR6o5 web crypto api 计算 sha256 确实快得有些离谱了。。。
    jethroX
        18
    jethroX  
    OP
       2024-04-01 15:58:54 +08:00
    @mxT52CRuqR6o5 我没去找 benchmark ,我是在一个知乎帖子上看到的,见 https://zhuanlan.zhihu.com/p/664350420
    jethroX
        19
    jethroX  
    OP
       2024-04-01 16:03:59 +08:00
    @mxT52CRuqR6o5 如果 web crypto api 能够支持分块计算的话,我就把 sha 部分的实现换成他了。有分块就可以展示进度,当长时间计算一个大文件没有进度的时候,心里会有点担心这玩意儿是不是卡死了,什么时候才能算出来啊。
    mxT52CRuqR6o5
        20
    mxT52CRuqR6o5  
       2024-04-01 16:22:58 +08:00
    @jethroX #18 我感觉他这个 case 循环次数太少了,都不一定能测出 jit 的实际性能,应该算一个大点的菲波那切数循环个几百几千次
    jethroX
        21
    jethroX  
    OP
       2024-04-01 16:36:28 +08:00
    @mxT52CRuqR6o5 确实,循环次数够大才能触发编译。有时间写个大点,还能水一篇博客,哈哈。
    vvhy
        22
    vvhy  
       2024-04-01 19:03:35 +08:00
    powershell Get-FileHash 挺好用
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5970 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 37ms UTC 02:48 PVG 10:48 LAX 19:48 JFK 22:48
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86