`

Java 自带MD5 校验算法,别上当

 
阅读更多

前天第一次发表博客到论坛,关于Java文件监控一文,帖子地址在:http://www.iteye.com/topic/1127281

评论的朋友很多,下载代码的朋友很不少,感谢在论坛上看我帖子的朋友,还有回复评论的朋友,给我提供建议的朋友。

 

从这些建议中,虽然语言简短,但是却有的是一语中的,这里说一下一下关于帖子的代码中HashFile中的MD5文件校验算法,

该算法是使用Java自带的MessageDigest类,测试结果,获取一个2G文件的MD5码,耗时 971秒,这效率太给力了,可以用坑爹来形容,所以用MD5文件校验码来判断文件是否被修改,对于小文件来说可能还合适,要是对大文件来说,好吧,撞墙死了算了!

 

HashFile中的代码是这样子的:

import java.io.FileInputStream;
import java.io.InputStream;
import java.security.MessageDigest;

public class HashFile {  
  
    /** 
     * @param args 
     */  
    public static char[] hexChar = { '0', '1', '2', '3', '4', '5', '6', '7',  
            '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; 
  
    public static String getHash(String fileName, String hashType)  
            throws Exception {  
        InputStream fis;  
        fis = new FileInputStream(fileName);  
        byte[] buffer = new byte[1024];  
        MessageDigest md5 = MessageDigest.getInstance(hashType);  
        int numRead = 0;  
        while ((numRead = fis.read(buffer)) > 0) {  
            md5.update(buffer, 0, numRead);  
        }  
        fis.close();  
        return toHexString(md5.digest());  
    }  
  
    public static String toHexString(byte[] b) {  
        StringBuilder sb = new StringBuilder(b.length * 2);  
        for (int i = 0; i < b.length; i++) {  
            sb.append(hexChar[(b[i] & 0xf0) >>> 4]);  
            sb.append(hexChar[b[i] & 0x0f]);  
        }  
        return sb.toString();  
    }  
}  

 

测试结果:


真给力啊,超过2G,效率变成这样 !

好吧,自带的MD5算法,上当了,对于检查文件是否更新这个问题来说,现在我使用的解决办法是File 类的lastModified方法,代码这样

	private String getHash(String fp){
		File file = new File(fp);
		return String.valueOf(file.lastModified());
	}

 通过比较文件的最后修改时间来判断文件是否更新,对大文件也轻松拿下,

测试结果是这样:



 当然针对不同问题肯定是有不同的解决办法,写这个博客的目的是告诉大家不要盲目相信JDK,Java自带的东西也有一定适用范围,有局限性,珍惜生命,请不要盲目相信JDK

 

分析原来HashFile代码,获取MD5校验码的瓶颈是出现在

public static String getHash(String fileName, String hashType)  
            throws Exception {  
        InputStream fis;  
        fis = new FileInputStream(fileName);  
        byte[] buffer = new byte[1024];  
        MessageDigest md5 = MessageDigest.getInstance(hashType);  
        int numRead = 0;  
        while ((numRead = fis.read(buffer)) > 0) {  //瓶颈
            md5.update(buffer, 0, numRead);  
        }  
        fis.close();  
        return toHexString(md5.digest());  
    }  

 在上面代码中,while循环N次,2G的文件,循环1024 * 1024  * 2 次,不给力!

分享到:
评论
1 楼 admade 2016-03-11  
   很不错

相关推荐

    JAVA生成MD5校验码

    1. **`java.security.MessageDigest` 类**:这是Java标准库提供的一个类,用于实现各种散列算法,包括MD5。通过`getInstance("MD5")`方法可以获得MD5的实例。 2. **散列过程**:首先,创建`MessageDigest`对象,...

    MD5校验算法源码 .c .h及一个使用例子

    在本压缩包中,提供了MD5校验算法的源码,包括`md5.c`和`md5.h`两个文件,以及一个使用示例,方便开发者直接应用到自己的项目中。 `md5.c`是MD5算法的实现文件,它包含了MD5的内部逻辑,如初始化、处理数据块、最后...

    java实现MD5加密算法

    总结,Java实现MD5加密算法主要是通过`java.security.MessageDigest`类,经过`getInstance("MD5")`获取MD5实例,然后使用`digest()`和`update()`方法处理数据,最终将二进制摘要转换为十六进制字符串。尽管MD5的安全...

    Java实现MD5大文件校验码详解

    Java实现MD5大文件校验码详细解析: 包括具体方法解释、注释 通俗易懂、易于理解

    java MD5 校验

    java MD5 校验

    MD5校验工具源码

    MD5(Message-Digest Algorithm 5)是一种广泛用于数据完整性校验和安全散列的算法。它由美国麻省理工学院的Ronald Rivest在1991年设计,主要用于确保数据在传输、存储或处理过程中的完整性。MD5算法会将任意长度的...

    嵌入式中MD5校验算法.c.h文件

    在提供的标题"嵌入式中MD5校验算法.c.h文件"中,我们可以推断这是一个用于嵌入式环境的MD5实现,包含C源代码文件(.c)和头文件(.h),可能提供了计算MD5摘要的函数和相关的数据结构定义。 描述中的"Md5_Check(0x...

    Java版CRC16校验算法

    CRC16校验算法及十六进制和十六进制字符串转换

    java的MD5算法

    ### Java中的MD5算法 #### 一、简介 在计算机科学领域中,MD5(Message-Digest Algorithm 5)是一种广泛使用的散列函数,能够将任意长度的数据转换为固定长度的128位(16字节)哈希值。由于其独特的特性,MD5被...

    文件校验工具 MD5 校验王 5.9.8.0 绿色中文免费版.zip

    文件校验工具 MD5 校验王中文版文件校验工具 MD5 校验王中文版 MD5 校验王可以对任意文件进行版本,文件时间,MD5值,SHA1值,CRC32值的校验。 计算选项: 版本:当选择校验文件为exe或者dll文件时,在运算结果中...

    matlab实现md5算法,md5算法详解,matlab

    总结来说,MATLAB实现MD5算法涉及的主要知识点包括:MD5算法的背景和用途,哈希函数的基本概念,MD5算法的四轮循环结构,FF、GG、HH、II四个非线性函数的作用,以及MATLAB中位运算和数组操作的应用。通过学习这个...

    C++md5校验生成源代码

    C++md5校验源码

    7z解压缩软件添加MD5校验功能插件

    7-zip其实很好的压缩软件,免费、开源、无广告,但是发现有个小瑕疵,就是有些人发的校验是MD5,但是7-zip校验列表里面没有MD5,只能用别的方式实现,如果能集成下就好了。 今天发现7-zip有人开发了一些插件,里面有...

    java实现Md5加盐加密算法

    对接接口时用到的一种常用加密算法,常用于验证签名,使用shiro-all-1.4.1.jar,可自行下载

    MD5校验值 MD5校验值.zip

    MD5校验值在IT行业中扮演着至关重要的角色,它是一种广泛使用的散列函数,能够将任意大小的数据转化为固定长度的128位(通常以32位十六进制数表示)的摘要值。这个摘要值是数据的“指纹”,因为相同的原始数据会产生...

    基于C++实现 MD5 算法的文件完整性校验程序【100010122】

    基于 MD5 算法的文件完整性校验程序,本实验使用 C++ 语言在 Linux 平台进行编程和运行。 ./md5 -h 查看帮助 ./md5 -t 打印程序的测试信息 ./md5 -c nankai.txt 计算出的被测文件的 MD5 摘要并打印 ./md5 -v nankai....

    java校验和算法

    由于需要和蓝牙通讯,协议需要用到校验和,找了很久才找到,给大家共享。java校验和算法绝对可以用。

    MD5加密算法的JAVA实现

    本文将深入探讨MD5算法在Java中的实现方式,包括其原理、代码实现以及应用场景。 ### MD5算法原理 MD5(Message-Digest Algorithm 5)是由Ron Rivest于1992年设计的一种散列算法,用于将任意长度的消息压缩成一个...

    STM32F103使用Ymodem协议更新程序带MD5校验.zip

    6、项目中用到了FAFTS文件系统、MD5校验算法、在线IAP等知识。 7、我用的是RS485协议,可以更改为SPI、IIC、串口、等。 8、程序自己已经在项目中使用,下面工程下载下来后可以直接使用,软件设置参考上面。

    MD5校验器 免安装 很好用 速度快 精准

    MD5校验器 免安装 很好用 速度快 精准 MD5校验(checksum)是通过对接收的传输数据执行散列运算来检查数据的正确性。 一个散列函数,比如 MD5,是一个将任意长度的数据字符串转化成短的固定长度的值的单向操作。任意...

Global site tag (gtag.js) - Google Analytics