一、引入外部库CryptoJS(简单)

1、字符串Hash

<!DOCTYPE html>
<html>
<head><title>Hash算法</title><script type="text/javascript" src="CryptoJS-3.1.2/rollups/md5.js"></script><script type="text/javascript" src="CryptoJS-3.1.2/rollups/sha1.js"></script><script type="text/javascript" src="CryptoJS-3.1.2/rollups/sha256.js"></script><script type="text/javascript" src="CryptoJS-3.1.2/rollups/hmac-sha1.js"></script><script type="text/javascript" src="CryptoJS-3.1.2/rollups/hmac-sha256.js"></script>
</head>
<body>
<script type="text/javascript">// ======================== Hash算法 ========================console.log('MD5:', CryptoJS.MD5("abc").toString());console.log('SHA1:', CryptoJS.SHA1("abc").toString());console.log('SHA256:', CryptoJS.SHA256("abc").toString());console.log('hmac-sha1:', CryptoJS.HmacSHA1("abc", "123").toString());console.log('hmac-sha256:', CryptoJS.HmacSHA256("abc", "123").toString());
</script>
</body>
</html>

2、文件Hash

<!DOCTYPE html>
<html>
<head><title>Hash算法</title><script type="text/javascript" src="CryptoJS-3.1.2/rollups/md5.js"></script>
</head>
<body>
<script type="text/javascript">window.onload = function () {function fileMd5Sum(file) {const fileReader = new FileReader();fileReader.onloadend = (ev) => {const md5 = CryptoJS.MD5(CryptoJS.enc.Latin1.parse(ev.target.result)).toString(CryptoJS.enc.Hex);console.log(md5);}fileReader.readAsBinaryString(file);}// 获取文件let file = document.getElementById("file");file.addEventListener("change", function () {fileMd5Sum(file.files[0]);})}
</script>
<input type="file" id="file"/>
</body>
</html>

3、参考

CryptoJS常用的加密算法使用及原理

https://blog.csdn.net/qq_21531681/article/details/108608131

二、不引入外部库(复杂)

【注意】要求https访问才可以使用。

1、字符串Hash

const content2 = '这是用来计算SHA-256的字符串的方法';async function digestMessage(message) {const msgUint8 = new TextEncoder().encode(message);                           // encode as (utf-8) Uint8Arrayconst hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8);           // hash the messageconst hashArray = Array.from(new Uint8Array(hashBuffer));                     // convert buffer to byte arrayconst hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); // convert bytes to hex stringreturn hashHex;
}digestMessage(content2).then(digestHex => console.log(digestHex));

参考:
vue/js通过计算 字符串 / 文件 sha1(SHA-1)值、sha256值等方法
https://blog.csdn.net/weixin_42634991/article/details/124601829

2、文件Hash

三种方法计算Hash值的方法都是相同的;只是将Hash值转换为16进制base 64不同。

(1)方法一

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title></title><script type="text/javascript">window.onload = function () {let file = document.getElementById("fileid");file.addEventListener("change", function () {let read = new FileReader();read.readAsArrayBuffer(file.files[0])read.onload = function () {(async function () {//let inputBytes = new TextEncoder().encode("hello world");let sha1 = await crypto.subtle.digest('SHA-1', read.result).then(a => Array.from(new Uint8Array(a)).map(a => a.toString(16).padStart(2, '0')).join(""));console.log(sha1);})();}})}</script>
</head>
<body>
<input type="file" id="fileid">
</body>
</html>

参考:

不用引入外部库,在浏览器上一行计算出SHA-1/SHA-256的结果

https://blog.csdn.net/emu/article/details/121862519

(2)方法二

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title></title><script type="text/javascript">window.onload = function () {/*** 获取16进制摘要字符串* @param buffer* @returns {string}*/function hex(buffer) {let code = [];let view = new DataView(buffer);for (var i = 0; i < view.byteLength; i += 4) {value = view.getUint32(i)let stringValue = value.toString(16)// 填充切片let padding = '00000000'let paddedValue = (padding + stringValue).slice(-padding.length)code.push(paddedValue);}return code.join("");}/*** 获取文件,计算hash* @type {HTMLElement}*/let file = document.getElementById("fileid");file.addEventListener("change", function () {let read = new FileReader();read.readAsArrayBuffer(file.files[0])read.onload = function () {(async function () {let arr = await crypto.subtle.digest('SHA-256', read.result);//console.log(arr);//调用函数,获取16进制摘要字符串let sha256Msg = hex(arr);console.log(sha256Msg);})();}})}</script>
</head>
<body>
<input type="file" id="fileid">
</body>
</html>

参考:

javascript获取文件sha-256,sha-384,sha-512摘要,验证文件是否被篡改,验证文件一致性,文件安全管理,计算文件的MD5值

https://blog.csdn.net/qq_41974199/article/details/124232425

(3)方法三

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title></title><script type="text/javascript">window.onload = function () {// from: https://stackoverflow.com/a/40031979/9014097function buf2hex(buffer) { // buffer is an ArrayBufferreturn Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');}// from https://stackoverflow.com/a/11562550/9014097function buf2Base64(buffer) {return btoa(String.fromCharCode.apply(null, new Uint8Array(buffer)));}/*** 获取文件,计算hash* @type {HTMLElement}*/let file = document.getElementById("fileid");file.addEventListener("change", function () {let read = new FileReader();read.readAsArrayBuffer(file.files[0])read.onload = function () {(async function () {let hashBytes = await window.crypto.subtle.digest("SHA-256", read.result);console.log(JSON.stringify({hash: buf2hex(hashBytes)})); // {"hash":"d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592"}console.log(JSON.stringify({hash: buf2Base64(hashBytes)})); // {"hash":"16j7swfXgJRpypq8sAguT41WUeRtPNt2LQLQvzfJ5ZI="}})();}})}</script>
</head>
<body>
<input type="file" id="fileid">
</body>
</html>

3、参考资料

为什么crypto.subtle.digest返回一个空对象

https://cloud.tencent.com/developer/ask/sof/767149

JavaScript计算文件Hash值(sha1 sha 256 md5)相关推荐

  1. js快速计算文件hash值

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

  2. 计算文件Hash(SHA1、MD5等)

    HashAlgorithm类支持数据块的Hash运算:对数据前面块通过TransformBlock方法计算,最后一块通过TransformFinalBlock方法计算,结果通过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. Java生成文件hash值

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

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

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

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

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

  8. html5计算文件hash,spark-md5生成hash码,spark-md5计算大文件hash码实现断点续传

    spark-md5import SparkMD5 from 'spark-md5'; var hexHash = SparkMD5.hash('Hi there');        // hex ha ...

  9. c语言计算文件摘要值,c语言文件操作摘要.ppt

    c语言文件操作摘要 第十章 文件 10.1 C文件概述 文件:存储在外部介质上数据的集合,是操作系统数据管理的单位 文件处理方法 缓冲文件系统:高级文件系统,系统自动为正在使用的文件开辟内存缓冲区 非 ...

最新文章

  1. 对相机所看的视角截屏保存为图片
  2. 基于ssh的ktv预定管理系统
  3. java二分查找法_java算法之二分查找法的实例详解
  4. 下拉菜单显示 隐藏html,根据在下拉列表中选择的内容隐藏和显示HTML元素
  5. python---tornado钩子预留解析
  6. 安卓WebView加载网页不显示或者乱跳问题
  7. SQL Server 2005的安装,SQL Server 2005系列之一
  8. 【2016年第1期】基于大数据的玉米田四代棉铃虫发生量的预测模型
  9. pandas plot label_Python+Pandas | 分析比特币与股票市场的关系
  10. mysql 两张大表关联_MySQL的DropTable影响分析和最佳实践
  11. Atheros QCA8337交换芯片驱动开发
  12. 关于ListView的优化
  13. 谷歌账号被封怎么办?谷歌账号解封申诉步骤请收好!
  14. css获取父元素下第几个元素出坑和JQuery通过index()获取下标出坑方法
  15. c++ 反射_基于飞凌FETA40i-C核心板在光时域反射仪中的应用原理
  16. 33、HTML高频前端面试题
  17. DM9006 linux driver
  18. [译] 细节是产品设计的重中之重
  19. 辽宁省内计算机专业本科大学排名,辽宁省本科院校排名
  20. 劲爆!java架构师百度网盘

热门文章

  1. 致传统企业朋友:不够痛就别微服务,有坑 (2)
  2. WebView-WebChromeClient详解
  3. JavaScript鼠标事件及案例
  4. C++高性能协程分布式服务框架设计
  5. Excel中工作表很多时,如何给工作表做目录?
  6. HashMap 遍历取值
  7. html左右超出,css 横向超出滚动 使用flex布局
  8. 设置两个无线路由器同时无线上网的方法
  9. 如何更改Excel中某些单元格的货币符号
  10. JSP Servlet 实现模糊动态查询并分页(拼接Sql)