1. 通过 requestIdleCallback or spark-md5利用浏览器空闲时间切片计算文件hash值:

requestIdleCallback简介:

window.requestIdleCallback(): 方法将 在浏览器的空闲时段内调用的函数排队。这使开发者能够在主事件循环上执行后台和低优先级工作,而不会影响延迟关键事件,如动画和输入响应。函数一般会按先进先调用的顺序执行,然而,如果回调函数指定了执行超时时间timeout,则有可能为了在超时前执行函数而打乱执行顺序。

file_hash.vue

<script>
import sparkMD5 from 'spark-md5'export default {methods: {async uploadFile() {const hash = await fileHash()console.log("文件哈希是:", hash)...},async fileHash() {const chunks = []let cur = 0while (cur < this.file.size) { // this.file 为 e.target.files[0]chunks.push({ index: cur, file: this.file.slice(cur, cur + 1 * 1024 * 1024)}) // 1MB/片cur += size}return new Promise( resolve => {const spark = new sparkMD5.ArrayBuffer()let count = 0const appendToSpark = async file => {return new Promise( resolve => {const reader = new FileReader()reader.readAsArrayBuffer(file)reader.onload = e => {spark.append(e.target.result)resolve()}})}const workLoop = async deadline => {while (count < chunks.length && deadline.timeRemaining() > 1) {//浏览器存在空闲时间await appendToSpark(chunks[count].file)count++if (count < chunks.length) {this.hashProgress = Number( ((100 * count) / chunks.length).toFixed(2) )} else {this.hashProgress = 100resolve(spark.end())}}window.requestIdleCallback(workLoop) // 给 workLoop 函数一个浏览器状态参数 deadline}window.requestIdleCallback(workLoop)   // 给 workLoop 函数一个浏览器状态参数 deadline})}
}
</script>

2. 通过 Worker spark-md5 快速切片计算文件hash值:

Worker介绍:

Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker线程,将一些任务分配给后者运行。在主线程运行的同时,Worker线程在后台运行,两者互不干扰。等到 Worker 线程完成计算任务,再把结果返回给主线程。这样的好处是,一些计算密集型或高延迟的任务,被 Worker 线程负担了,主线程(通常负责 UI 交互)就会很流畅,不会被阻塞或拖慢。

Worker 线程一旦新建成功,就会始终运行,不会被主线程上的活动(比如用户点击按钮、提交表单)打断。这样有利于随时响应主线程的通信。但是,这也造成了 Worker 比较耗费资源,不应该过度使用,而且一旦使用完毕,就应该关闭。

目录介绍:

├── static
│   ├── hash.js             //快速计算文件hash入口文件 (放在 static 文件夹是为了方便 Worker 访问)
│   └── spark-md5.min.js    //需要用到 spark-md5 库
├── pages
│   └── file_hash.vue       //快速计算文件hash
│   ...
yarn add spark-md5 // 安装该库, 将其内部的 spark-md5.min.js 文件和 hash.js放在一起共 importScripts 访问

file_hash.vue

<script>
export default {methods: {async uploadFile() {const hash = await fileHash()console.log("文件哈希是:", hash)...},async fileHash() {const chunks = []let cur = 0while (cur < this.file.size) { // this.file 为 e.target.files[0]chunks.push({ index: cur, file: this.file.slice(cur, cur + 1 * 1024 * 1024)}) // 1MB切片cur += size}return new Promise( resolve => {this.worker = new Worker('/hash.js')// 开启一个外部进程this.worker.postMessage({ chunks }) // 给外部进程传递信息 this.worker.onmessage = e => {      // 接收外部Worker回传的信息const { progress, hash } = e.datathis.hashProgress = Number(progress.toFixed(2)) //计算hash值的进度条if (hash) {resolve(hash) // 得到计算出来的hash}}})}
}
</script>

hash.js:

self.importScripts('spark-md5.min.js') // 引入 spark-md5self.onmessage = e => {                // 接收主线程传递的参数const { chunks } = e.dataconst spark = new self.SparkMD5.ArrayBuffer()let progress = 0, count = 0const loadNext = index => {if (index == 0) {progress = 0count = 0}const reader = new FileReader()reader.readAsArrayBuffer(chunks[index].file)reader.onload = e => {count++spark.append(e.target.result)    // 将读取的内容添加入spark生成hashif (count == chunks.length) {self.postMessage({progress: 100,hash: spark.end()})} else {progress += 100 / chunks.lengthself.postMessage({ progress })loadNext(count)}}}loadNext(0)
}

拓展:通过抽样加快hash的计算速度

方法:抽取文件内一部分字段放入 chunks 数组内,通过减小计算 hash 的文件大小, 来增加hash的计算速度。
缺点:有少许可能照成误差,对于需精确计算hash则不适用,取舍有寸即可!

例如:

<script>
import sparkMD5 from 'spark-md5'export default {methods: {async calculateHashSample() {// this.file 为 e.target.files[0]const spark = new sparkMD5.ArrayBuffer(), reader = new FileReader(),file = this.file, size = file.size, offset = 2 * 1024 * 1024 // hash抽样: 第一个区块2M,中间区块取前中后各2个字节,最后区块数据全要let chunks = [file.slice(0, offset)]let cur = offsetwhile (cur < size) {if (cur + offset >= size) {chunks.push(file.slice(cur, cur + offset))} else {const mid = cur + offset / 2, end = cur + offsetchunks.push(file.slice(cur, cur + 2))chunks.push(file.slice(mid, mid + 2))chunks.push(file.slice(end - 2, end))}cur += offset}this.chunks = chunks //抽样后的区块//下面拿去计算hash就会很快}
}
</script>

js快速计算文件hash值相关推荐

  1. 快速改变文件hash值的方法

    查看哈希值命令 Linux : md5sum + 文件名 $ md5sum 1.png fe5c3f5ef1d207bc1b646911b463c907 1.png Windows : certuti ...

  2. JavaScript计算文件Hash值(sha1 sha 256 md5)

    一.引入外部库CryptoJS(简单) 1.字符串Hash <!DOCTYPE html> <html> <head><title>Hash算法< ...

  3. vue 计算文件hash值_vue项目打包文件增加hash值

    vue项目打包文件增加hash值 vue-cli2项目 修改vue项目根目录下的 build/webpack.prod.conf.js文件 js文件: output: { path: config.b ...

  4. vue 计算文件hash值_vue的hash值原理,也是table切换。

    .pages>div{display: none;} aaa bbb cccc 首页 关于我的页面 用户中心 //hash 和页面一一对应起来 //router 配置 var router = ...

  5. 不用工具,如何快速计算文件的MD5?

    网络安全现在是信息化系统中的必备要素.大家在各种软件下载站上下载的文件,到底有没有被植入木马,是否安全,你心里有底吗?植入木马的一种常用手段,就是黑客先拿下软件下载站点,甚至自己搭建一个站点,然后等你 ...

  6. Java生成文件hash值

    Java生成文件hash值(通过传入file或者InputStream) package com.hczy.syncdata.common.util;import java.io.File; impo ...

  7. 关于计算ico文件hash值脚本

    如何利用ico文件查找出网站的真实IP地址,分享一个计算网站ico文件hash值的工具(python2和python3双版本代码) python2的工具脚本代码 python3的工具脚本代码 pyth ...

  8. windows/linux计算文件 MD5值

    windows 计算文件 MD5值 cmd下输入: certutil -hashfile filename MD5 如: certutil -hashfile C:\1.txt MD5 //打印到屏幕 ...

  9. STM32计算文件MD5值校验数据

    首先介绍一下什么是MD5: 一.MD5计算将整个文件或者字符串,通过其不可逆的字符串变换计算,产生文件或字符串的MD5散列值.任意两个文件.字符串不会有相同的散列值(即"很大可能" ...

最新文章

  1. 开源 免费 java CMS - FreeCMS1.5-信息管理
  2. 不同于NLP,数据驱动方法与机器学习无法攻克NLU,原因有三点
  3. ConcurrentHashMap源码解析(1)
  4. Windows系统文件详解【大全】
  5. Redis开发运维实践问题处理只内存检查
  6. 南核目录2020pdf_北核+南核|《消费经济》2020年重点选题
  7. boost::geometry::make用法的测试程序
  8. C++的常量折叠(一)
  9. 阔别七载,阿里港交所这对“初恋”再牵手
  10. UI设计师一定要懂的专业名词
  11. 在​W​C​F​中​使​用​消​息​队​列​M​S​M​Q
  12. Python爬虫之40行代码爬取金庸所有武侠小说
  13. 泛微云桥e-birdge之金蝶云之家集成配置手册
  14. linux操作系统adsl 上网设置,Linux操作系统上ADSL拨号上网的方法详解
  15. 计算机开机密码设置要求,电脑开机密码怎么设置,开机密码设置很简单!
  16. 为什么光标停在表格中间_在word光标处粘贴一表格,结果表格跑到别的位置,为啥?...
  17. Unix时代的开创者Ken Thompson (zz.is2120.bg57iv3)
  18. 区块链和AI的比武,谁将登上黑科技这一宝座
  19. 消息队列及短信发送平台
  20. Win11卸载程序在哪里?Win11卸载软件的两种方法

热门文章

  1. 测试显卡用什么软件最好,用什么软件能检测显卡的好坏?
  2. 初学者选琴|VEAZEN费森VZ90和雅马哈FG800对比,看看哪一款更适合入门?
  3. 佳博打印机android版本代码优化
  4. 干货丨初学者学Java应该安装什么软件?
  5. MAC(苹果)修改Mac地址,添加路由
  6. 第一章(第四节)百威电音节
  7. 使用 Web Services 整合 IBM FileNet P8 BPM 与 IBM WebSphere ILOG JRules
  8. 资源采集网php源码,ThinkPHP5.1 自动采集资源网 源码开源
  9. Jpcap简介(转)
  10. poi3.13生成多级标题