通过SparkMD5来进行文件MD5计算

7,755 阅读2分钟

一、MD5计算将整个文件或者字符串,通过其不可逆的字符串变换计算,产生文件或字符串的MD5散列值。任意两个文件、字符串不会有相同的散列值(即“很大可能”是不一样的,理论上要创造出两个散列值相同的字符串是很困难的)。

二、因此MD5常用于校验字符串或者文件,以防止文件、字符串被“篡改”。因为如果文件、字符串的MD5散列值不一样,说明文件内容也是不一样的,即经过修改的,如果发现下载的文件和给的MD5值不一样,需要慎重使用。

三、MD5文件校验用途非常多,例如:游戏补丁包的校验,病毒文件确认,APP提审校验等;如果要确认某一个文件的完整性和正确性,都会使用MD5进行校验。

安装

npm i spark-md5 // 安装spark-md5

全局引入spark-md5

import SparkMD5 from "spark-md5";
Vue.prototype.$SparkMD5 = SparkMD5

或者在tool.js封装处理方法

import SparkMD5 from "spark-md5";
/**
 * @description: md加密
 * @param {*
 * file:文件对象
 * chunkSize:单位大小
 * }
 * @return {*}
 */
const tool = {
md5(file, chunkSize) {
return new Promise((resolve, reject) => {
let blobSlice =
File.prototype.slice ||
File.prototype.mozSlice ||
File.prototype.webkitSlice;
let chunks = Math.ceil(file.size / chunkSize);
let currentChunk = 0;
let spark = new SparkMD5.ArrayBuffer(); //追加数组缓冲区。
let fileReader = new FileReader(); //读取文件
fileReader.onload = function(e) {
spark.append(e.target.result);
currentChunk++;
if (currentChunk < chunks) {
loadNext();
        } else {
let md5 = spark.end(); //完成md5的计算,返回十六进制结果。
resolve(md5);
// console.log(md5);
        }
      };

fileReader.onerror = function(e) {
reject(e);
      };

function loadNext() {
let start = currentChunk * chunkSize;
let end = start + chunkSize;
if (end > file.size) {
end = file.size;
        }
fileReader.readAsArrayBuffer(blobSlice.call(file, start, end));
      }
loadNext();
    });
  }
};
export default tool;

调用:

handleFileChange(e) {
const [file] = e.target.files;
if (!file) return;
this.tool
        .md5(file, SIZE)
        .then(res => {
// 获取到文件的md5
this.params.md5 = res;
        })
        .catch(res => {
// 处理异常
console.error(res);
        });
Object.assign(this.$data, this.$options.data()); // 还原初始data对象
this.container.file = file;
    },

后记:

  • 切片上传的情况之下,有的需求是每一个切片md5值,有的情况下是整个文件的值
  • “d41d8cd98f00b204e9800998ecf8427e”指的是空字符串
  • spark.end()类似“剪切”,只能粘贴一次!也就是只能使用第一次,如果第二次使用的话就是传出空字符串SparkMD5的优势是啥?
  • SparkMD5是MD5算法的快速md5实现。该脚本基于JKM md5库,该库是最快的算法。对JKM md5的改进像大多数服务器端算法一样,字符串被转换为utf8修正大量数据的计算(溢出)增量md5支持数组缓冲区(类型化数组)功能封装在闭包中,以避免全局分配面向对象的库CommonJS(可在节点中使用)和AMD集成通过JSHint和JSCS传递的代码增量md5对于散列大量数据(例如文件)的性能要好得多。可以使用FileReader&Blob读取成块的文件,并为md5哈希附加每个块,同时保持较低的内存使用率。请参见下面的示例。