# spark-md5

# 1. 安装

# 1.1. npm

安装:

npm i spark-md5

引用:

import SparkMD5 from 'spark-md5';

SparkMD5.hash('张三123456');

# 1.2. script 标签

<!-- 开发 -->
<script src="./node_modules/spark-md5/spark-md5.js"></script>
<!-- 生产 -->
<script src="./node_modules/spark-md5/spark-md5.min.js"></script>

<script>
SparkMD5.hash('张三123456');
//=> ea000b6d22e95b5ae874453918efa533
</script>

# 2. 文本摘要

spark-md5:

SparkMD5.hash('张三123456');
//=> ea000b6d22e95b5ae874453918efa533

spring:

import org.springframework.util.DigestUtils;

String md5 = DigestUtils.md5DigestAsHex(password.getBytes());
System.out.println("md5 = " + md5);
//=> ea000b6d22e95b5ae874453918efa533

# 3. 文件摘要

spark-md5:

<div>
  <input id="input" type="file">
  <button id="btn">md5</button>
</div>
<div>
  MD5: <span id="shown"></span>
</div>

<script src="libs/spark-md5.js"></script>
<script>
  let inputElt = document.getElementById('input');
  let shownElt = document.getElementById('shown');
  let btnElt = document.getElementById('btn');

  btnElt.addEventListener('click', () => {
    if (inputElt.files.length === 0) {
      console.error("请选择文件")
      return;
    }

    const [ file ] = inputElt.files

    md5File(file).then((md5) => {
      console.log(md5);
      shownElt.textContent = md5;
    })
  })

  function md5File(file) {
    return new Promise((resolve) => {
      const blobSlice = File.prototype.slice;
      const chunkSize = 2097152; // Read in chunks of 2MB
      const chunks = Math.ceil(file.size / chunkSize);
      let currentChunk = 0;

      const spark = new SparkMD5.ArrayBuffer();
      const fileReader = new FileReader();

      fileReader.onload = (e) => {
        spark.append(e.target.result); // Append array buffer
        currentChunk += 1;

        if (currentChunk < chunks) {
          loadNext();
        } else {
          const data = spark.end();
          resolve(data); // hash
        }
      };

      fileReader.onerror = () => {
        console.warn('oops, something went wrong.');
        resolve('');
      };

      function loadNext() {
        const start = currentChunk * chunkSize;
        const end = ((start + chunkSize) >= file.size) ? file.size : start + chunkSize;

        fileReader.readAsArrayBuffer(blobSlice.call(file, start, end));
      }

      loadNext();
    })
  }
</script>

spring:

import org.springframework.util.DigestUtils;

String filePath = "static/md5/files/吴钦飞-点风科技周计划-20250908-20250912.xlsx";

try (InputStream excelFileInputStream = this.getClass().getClassLoader().getResourceAsStream(filePath)) {
    if (excelFileInputStream == null) {
        return;
    }

    String md5 = DigestUtils.md5DigestAsHex(excelFileInputStream);

    System.out.println("file md5 = " + md5);
    //=> 0818233e8fa4404a99e54ac24fda3414
}
本章目录