首页 > 其他分享 >【实用技巧】MD5 的重复请求应用以及性能测试

【实用技巧】MD5 的重复请求应用以及性能测试

时间:2024-12-19 21:57:07浏览次数:7  
标签:实用技巧 file 文件 重复 测试 stopWatch new MD5

1  前言

大家可能都遇到幂等或者娇艳重复提交的问题,比如重复的 JSON 请求、文件上传相同的文件重复上传了两次等,当然了确实存在某种情况比如人家用户一会上传了一个文件隔了一会儿又上传一个同样的文件是合理的,我们要做的就是短时间内的重复提交。

这个时候我们可以通过计算请求的 MD5值来进行过滤,比如计算出来的 MD5 放到 Redis 里(设置上过期时间比如1分钟),然后每次请求先看下Redis 中是否存在相同的 MD5,有的话说明是重复请求直接打回即可,当然了前端也能校验,但是后端的校验还是要有的。

MD5 的特点:相同的内容每次计算的MD5值一样,但凡有一丁点变化 MD5 就不一样

那么比如对于某个文件可能有 10K、5M、60M、100M,那么 MD5 值的计算效率如何呢?我们本节来小测一下。

2  实践

2.1  测试代码

我这里就直接贴了哈:

package com.virtuous.demo.laboratory.algorithm.md5;

import org.springframework.util.StopWatch;

import java.io.*;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5FileExample {

    // 8K 缓冲区
    private static final int BUFFER_SIZE = 8192;

    public static String calculateMD5(File file) throws NoSuchAlgorithmException, IOException {
        MessageDigest md = MessageDigest.getInstance("MD5");
        try (
            InputStream is = new FileInputStream(file);
            BufferedInputStream bis = new BufferedInputStream(is);
        ) {
            byte[] buffer = new byte[BUFFER_SIZE];
            int bytesRead;
            while ((bytesRead = bis.read(buffer)) != -1) {
                // 逐增更新 MD5
                md.update(buffer, 0, bytesRead);
            }
        }

        byte[] digest = md.digest();
        StringBuilder sb = new StringBuilder();
        for (byte b : digest) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        // 替换为你的文件路径
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        File file = new File("/Users/kuku/projects/wode/virtuous-demo/src/main/resources/test.docx");
        try {
            String md5Hash = calculateMD5(file);
            stopWatch.stop();
            System.out.println("总计耗时:" + stopWatch.getTotalTimeMillis());
            System.out.println("MD5: " + md5Hash);
        } catch (NoSuchAlgorithmException | IOException e) {
            e.printStackTrace();
        }
    }
}

2.2  测试效果

2.2.1  MD5 效果

我们先看看 MD5 的效果:

我这里有个文件,我们先看看在不改变文件内容的情况下,是不是每次计算的 MD5 值是不是一样的,按理应该是一样的哈。

我这里就不拿 Jmeter 压测了哈,我就测了几遍:

应该都是一样的哈,当我把文件内容只改了一个字的时候,再来计算一下:

可以看到已经变化了哈,还别说这玩意挺强啊。

2.2.2  MD5 计算性能测试

这里我就不一一截图了哈,我直接把我的数据贴出来哈(每个文件我都执行了3次):

文件大小 耗时
22K 50ms左右
223K 60ms左右
1.4M 70ms左右
4.4M 80ms左右 偶尔102ms
12M 90ms左右 偶尔124ms
33M 190ms左右 偶尔142ms 偶尔214ms

看上去这个效果我是觉得还行。

3  小结

好啦,大家也可以测试一下,一起来讨论一下。

标签:实用技巧,file,文件,重复,测试,stopWatch,new,MD5
From: https://www.cnblogs.com/kukuxjx/p/18617952

相关文章

  • 「测试人员」年终总结及来年规划
    ......
  • 【硬件测试】基于FPGA的2FSK调制解调系统开发与硬件片内测试,包含信道模块,误码统计模
    1.算法仿真效果本文是之前写的文章 基于FPGA的2FSK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR_fpga2fsk-CSDN博客 的硬件测试版本。 在系统在仿真版本基础上增加了ila在线数据采集模块,vio在线SNR设置模块,数据源模块。 硬件ila测试结......
  • 接口测试基础
    认识接口测试:1、是什么基于不同的输入参数,校验接口响应数据与预期数据是否一致。2、学什么接口测试用例设计工具实现接口测试代码实现接口测试3、流程接口文档解析设计测试用例脚本开发执行脚本缺陷跟踪测试报告4、URLURL:互联网上标准资源的地址,一般称为统一资源定......
  • Minium+PageObject:小程序UI自动化测试实践
    随着小程序的普及,用户体验成为各大开发团队追求的核心目标。UI自动化测试不仅提高了开发效率,更在提升用户满意度方面起到了至关重要的作用。而当你还在手动测试时,有人已经借助Minium+PageObject架构完成了全自动化的UI测试。那么,Minium+PageObject是如何为小程序UI自动化测......
  • 渗透测试实战—利用防火墙突破网络隔离
    免责声明:文章来源于真实渗透测试,已获得授权,且关键信息已经打码处理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。前言......
  • 端口连通性测试方法
    端口连通性测试方法一、telnettelnet<ip><port>说明:ip:是测试主机的ip地址port:是端口,比如22方法二、sshssh-v-pportusername@ip说明:-v调试模式(会打印日志)-p指定端口username:远程主机的登录用户ip:远程主机如果远程主机开通了相应的端口,会有如下图所示的......
  • Fiddler(抓包测试工具)下载安装步骤
    目录介绍主要功能:使用场景:一、下载二、安装​编辑三、测试介绍Fiddler是一个强大的网络调试工具,用于捕获和分析HTTP/HTTPS请求与响应。它通过代理服务器捕获流量,帮助开发者调试Web应用、API,进行性能分析和安全测试。ps:一般搭配postman使用进行测试网页主要功......
  • 关于如何正确在测试用例中mock静态方法的问题
    文章目录情况一:希望在测试用例中直接执行静态方法的逻辑情况二:不希望在测试用例中执行静态方法的逻辑插桩方法坑1:报错SubclassByteBuddyMockMaker原因与解决方案坑2:报错theexistingstaticmockregistrationmustbederegistered原因与解决方案关于如何正确在......
  • 电源老化测试负载在各领域的作用
    电源老化测试负载在电子、通信、电力、汽车等领域中扮演着关键角色,主要用于验证和确保电源设备的性能和可靠性。以下是其在各领域的具体作用:电子领域:在电子产品的研发和生产过程中,电源老化测试负载用于模拟真实工作环境中的电流、电压等参数,对电源进行长时间连续工作测试。这有......
  • 软件测试工程师进阶之路:从基础夯实到前沿创新与团队引领
    一、基础阶段编程语言学习选择一种编程语言深入学习,如JAVA或Python。学习其基础语法、数据类型、控制结构、函数与模块等。例如通过在线教程、相关书籍进行系统学习,同时进行大量的代码练习,如编写简单的数学计算程序、数据处理程序等,以巩固所学知识,培养良好的编程习惯。......