使用js验证hash,content hash , chunk hash的区别解析

 更新时间:2024年12月07日 09:55:38   作者:silvia_frontend  
crypto-js是一个JavaScript加密算法库,用于实现各种加密算法和哈希函数,它提供了一种简单而强大的方式来执行加密操作,包括对称加密算法、非对称加密算法和哈希函数等,本文给大家介绍使用js验证hash,content hash , chunk hash的区别解析,感兴趣的朋友跟随小编一起看看吧

一、使用js验证hash, content hash , chunk hash的区别

1、计算一般的 Hash(以简单字符串为例)

使用crypto-js库来进行哈希计算,需提前引入npm install crypto-js库。

crypto-js: 是一个JavaScript加密算法库,用于实现各种加密算法和哈希函数,它提供了一种简单而强大的方式来执行加密操作,包括对称加密算法、非对称加密算法和哈希函数等。

  • 实现:这里以一个简单字符串来验证,使用CryptoJS.SHA256进行加密, 字符串改变,生成的加密值肯定不同。
  • 应用:一般开发登录模块的时候会用到,服务端存储的是这个哈希值,当再次登录输入密码时,会再次计算密码的哈希值,并和存储的哈希值做比较。
const CryptoJS = require("crypto-js");
// Hash
const password = "this is my passward 1234";
const hash = CryptoJS.SHA256(password).toString();
console.log("Hash:", hash);

2、计算 Content Hash(基于文本内容整体的哈希)

首先准备一个txt文件,然后通过fs读取文件内容。
text.txt:

这是一段测试的文本!!!
11111111111111111
222222222
3333333333
44444444

fs模块: Node.js提供的对系统文件及目录进行读写操作的模块。
fs.readFile(filename,[option],callback) 方法读取文件。

  • 实现:加密方法还是和上面的一样,只不过是通过fs获取的文件内容。可以看到,内容哈希关注的是文件内容本身的完整性。如果文件内容发生变化,内容哈希值也会随之改变。
  • 场景:在内容分发网络(CDN)中判断资源是否更新等场景,只要内容没变化,内容哈希值就不会变。
const CryptoJS = require("crypto-js");
const fs = require("fs");
// Content Hash
fs.readFile("src/test.txt", "utf-8", (err, data) => {
    if (err) {
        console.error("Error reading file:", err);
        return;
    }
    const contentHash = CryptoJS.SHA256(data).toString();
    console.log("Content Hash: ", contentHash);
});

3、计算 Chunk Hash(将内容分块后计算哈希)

和上面内容哈希的获取方式一样,只不过需要将获取到的文件划分成多个chunk,然后对每个chunk进行加密。

const CryptoJS = require("crypto-js");
const fs = require("fs");
// Chunk Hash
const CHUNK_SIZE = 10; // 每个块的大小(字节)
fs.readFile("src/test.txt", "utf-8", (err, data) => {
    if (err) {
        console.log("err", err);
        return;
    }
    const chunkHashes = []; // 块hash值数组
    for (let i = 0; i < data.length; i += CHUNK_SIZE) {
        const chunkContent = data.slice(i, i + CHUNK_SIZE);
        const chunkHash = CryptoJS.SHA256(chunkContent).toString();
        chunkHashes.push(chunkHash);
    }
    console.log("Chunk Hashes", chunkHashes);
});

slice()方法:是 JavaScript 中用于提取字符串或数组部分内容的方法。它返回一个新的字符串或数组,包含从原字符串或数组中提取的部分元素,原字符串或数组本身不会被修改。

语法string.slice(startIndex[, endIndex])。其中startIndex是提取的起始位置(索引从 0 开始),endIndex是提取的结束位置(不包括该位置的字符)。如果省略endIndex,则提取从startIndex到字符串末尾的部分。

改变txt文件中的后面一点内容,然后观察到前面的chunk的hash都没变,只有后面的两个hash改变了。

场景:这种块哈希的计算方式常用于大型文件传输等场景,在传输或存储过程中可以分别验证每个块的完整性,通过对比每个块的哈希值与原始的块哈希是否一致来判断块数据是否准确。

二、webpack配置中这三种hash的作用分析

1、Hash(模块标识符哈希)

在webpack中,hash是基于整个构建内容(包括所有模块、资源等)生成的一个哈希值,每次构建时,只要一个文件改变,这个哈希值就会改变。

module.exports = { 
    //...其他配置 
    output: { filename: '[name].[hash:8].js' }  //:8就是指定生成的hash值是8位的
};
  • 优点: 简单直接,可以用于版本控制和缓存清除。当新的构建发生时,由于hash值改变,浏览器会重新下载新的资源文件,保证用户获取到最新的内容。
  • 缺点: 比如即使一个css文件一个小改动,重新构建时哈希值都会改变,可能导致不必要的缓存失效,影响性能。

2、Content Hash(内容哈希)

在webpack中,content-hash是根据文件内容(具体模块或资源的内容)生成的哈希值。它只和文件自身的内容有关,与其他文件或构建过程中的其他因素无关。

module.exports = { 
    //...其他配置 
    output: { filename: '[name].[contenthash].js' } 
};

优点: 精确地基于内容进行哈希计算,使得只有内容发生变化的文件,其文件名才会改变。这对于缓存管理非常有利。缺点: 计算成本相对较高,因为需要对每个文件内容进行单独的哈希计算。不过,在现代构建工具和硬件条件下,这个缺点通常可以接受。

3、Chunk Hash(块哈希)

在webpack中,chunk-hash是基于 Webpack 打包后的代码块(chunk)生成的哈希值。Webpack 在打包过程中会将相关的模块组合成代码块,chunk-hash就是针对这些代码块进行计算的。

module.exports = { 
    //...其他配置 
    output: { filename: '[name].[chunkhash].js' } 
};
  • 优点: 可用于代码分割(code-splitting)场景。如:一个 Web 应用有多个入口点(如main.jsvendor.js),通过chunk-hash可以为每个入口点对应的代码块生成独立的哈希值。这样,当一个代码块(如vendor.js包含第三方库)的内容没有变化时,其对应的文件名不会因为其他代码块(如main.js)的变化而改变,有利于浏览器缓存的有效利用。
  • 缺点: 如果代码块的划分发生变化(例如,调整了 Webpack 的代码分割策略),即使模块内容没有改变,chunk-hash值也可能会改变,从而影响缓存。

这篇文章我们通过js验证了一下hash, content hash , chunk hash的区别,并对比了一下webpack中的使用场景,希望对对webpack这里配置有疑惑的伙伴有帮助。

到此这篇关于使用js验证hash, content hash , chunk hash的区别的文章就介绍到这了,更多相关js验证hash, content hash , chunk hash内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • javascript实现点击图片切换

    javascript实现点击图片切换

    这篇文章主要介绍了javascript实现点击图片切换,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • textarea支持图形编辑的实现方法

    textarea支持图形编辑的实现方法

    本来以为只有iframe支持编辑了,今天突然发现textarea也支持编辑 :( 是不是我太愚钝了? textarea不能用innerHTML来插入html,而用appendChild 这样的话稍微修改下,评论等简单的textarea的表情插入就可以直接显示出来了 而不是只显示emot了 比较实用标题起的确切,但如果叫“现textarea支持编辑”似乎更废话
    2008-03-03
  • IE下双击checkbox反应延迟问题的解决方法

    IE下双击checkbox反应延迟问题的解决方法

    这篇文章主要介绍了IE下双击checkbox反应延迟问题的解决方法,需要的朋友可以参考下
    2014-03-03
  • 使用20行JS代码实现屏幕录制功能

    使用20行JS代码实现屏幕录制功能

    在开发中可能有遇到过屏幕录制的需求,无论是教学、演示还是游戏录制,都需要通过屏幕录制来记录和分享内容,MediaRecorder 是一种强大的技术,可以在浏览器端实现屏幕录制功能,本文将介绍如何使用JS MediaRecorder 实现屏幕录制,需要的朋友可以参考下
    2023-11-11
  • JS多次请求接口按顺序依次执行解决办法

    JS多次请求接口按顺序依次执行解决办法

    在JavaScript中for循环是同步的,意味着每个循环都会等待前一个循环的请求完成后才会执行下一个循环,这篇文章主要给大家介绍了关于JS多次请求接口按顺序依次执行的解决办法,需要的朋友可以参考下
    2024-04-04
  • JavaScript面向对象编程实现模拟

    JavaScript面向对象编程实现模拟

    面向对象编程(Object Oriented Programming)将现实世界中的复杂关系抽象成一个个对象,通过对象之间的分工合作对现实世界进行模拟
    2022-10-10
  • 总结Javascript中的隐式类型转换

    总结Javascript中的隐式类型转换

    这篇文章谈谈JavaScript的隐式类型转换,我们知道在JavaScript中声明变量不需指定类型, 对变量赋值也没有类型检查,同时JavaScript允许隐式类型转换。这些特征说明JavaScript属于弱类型的语言。
    2016-08-08
  • bootstrap 通过加减按钮实现输入框组功能

    bootstrap 通过加减按钮实现输入框组功能

    这篇文章主要介绍了bootstrap 输入框组 通过加减按钮来增加删除内嵌输入框组,当我点击 + 按钮时,会添加一行输入框组;当点击 - 按钮时,会删除这一行输入框组。具体实现代码大家参考下本文
    2017-11-11
  • 微信小程序可滑动周日历组件使用详解

    微信小程序可滑动周日历组件使用详解

    这篇文章主要为大家详细介绍了微信小程序可滑动周日历组件的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • 解决前端使用xlsx.js工具读取excel遇到时间日期少43秒问题

    解决前端使用xlsx.js工具读取excel遇到时间日期少43秒问题

    这篇文章主要给大家介绍了关于如何解决前端使用xlsx.js工具读取excel遇到时间日期少43秒问题的相关资料,xlsx.js是一种前端库,它可以使您使用JavaScript读取、解析和导出电子表格文件,如Microsoft Excel,需要的朋友可以参考下
    2024-03-03

最新评论