Java 自带MD5 校验文件
http://www.iteye.com/topic/1127319
前天第一次发表博客到论坛,关于Java文件监控一文,帖子地址在:http://www.iteye.com/topic/1127281
评论的朋友很多,下载代码的朋友很不少,感谢在论坛上看我帖子的朋友,还有回复评论的朋友,给我提供建议的朋友。
从这些建议中,虽然语言简短,但是却有的是一语中的,这里说一下一下关于帖子的代码中HashFile中的MD5文件校验算法,
该算法是使用Java自带的MessageDigest类,测试结果,获取一个2G文件的MD5码,耗时 971秒,这效率太给力了,可以用坑爹来形容,所以用MD5文件校验码来判断文件是否被修改,对于小文件来说可能还合适,要是对大文件来说,好吧,撞墙死了算了!
HashFile中的代码是这样子的:

真给力啊,超过2G,效率变成这样 !
好吧,自带的MD5算法,上当了,对于检查文件是否更新这个问题来说,现在我使用的解决办法是File 类的lastModified方法,代码这样
通过比较文件的最后修改时间来判断文件是否更新,对大文件也轻松拿下,
测试结果是这样:

当然针对不同问题肯定是有不同的解决办法
分析原来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());
- }
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 次,不给力!
chimer回复
来个nio的简单版,看你们老是怀疑java慢
C++ MD5工具验证结果:
File: K:\Games\World of Warcraft\Data\common.MPQ
Size: 2226587191 bytes
Modified: 2008年11月19日 星期三, 12:57:24
MD5: CD9F9C5523F3BA3866B81CCC74ED6476
java运行结果,毫秒
耗时:12672,cd9f9c5523f3ba3866b81ccc74ed6476
核心代码
String hashType = "MD5";
FileInputStream fStream = null;
try {
MessageDigest md5 = MessageDigest.getInstance(hashType);
fStream = new FileInputStream(
//"K:\\Games\\World of Warcraft\\Scan.dll");
//"K:\\Games\\World of Warcraft\\Data\\patch-3.MPQ");
"K:\\Games\\World of Warcraft\\Data\\common.MPQ");
FileChannel fChannel = fStream.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(8*1024);
long s = System.currentTimeMillis();
for ( int count = fChannel.read( buffer ); count !=-1 ; count = fChannel.read( buffer )
) {
buffer.flip();
md5.update( buffer );
if( !buffer.hasRemaining() ){
//System.out.println("count:"+count);
buffer.clear();
}
}
s = System.currentTimeMillis() - s;
System.out.println( "耗时:"+s+","+getString( md5.digest() ) );
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if( fStream!=null )
fStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Java 自带MD5 校验文件的更多相关文章
- Java 自带MD5加密 Demo
package demo; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; pub ...
- Java:基于MD5的文件监听程序
前述和需求说明 和之前写的 Python:基于MD5的文件监听程序 是同样的功能,就不啰嗦了,就是又写了一个java版本的,可以移步 python 版本去看一下,整个的核心思路是一样的.代码已上传Gi ...
- java 自带md5加密
package test; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; pub ...
- 关于JAVA自带MD5的方法
有空再详细解释 import java.security.MessageDigest; public class MD5 { public final static String MD51(Strin ...
- WINDOWS自带md5校验工具
WINDOWS自带的工具certutil.exe, certutil -hashfile chropp.exe MD5; 就可以了
- MD5 校验文件
https://blog.csdn.net/wudishine/article/details/42466831 MD5.h #ifndef MD5_H #define MD5_H #include ...
- Shell 对整个文件夹中的文件进行MD5校验 [转]
查看本地文件的 MD5 命令:md5sum FileName查看home目录下所有文件的 MD5 码:cd ~find /home -type f -print0 | xargs -0 md5sum ...
- 文件夹进行MD5校验的实现算法
每份相同数据(文件夹)都可以生成一份唯一的md5校验文件,我们可以通过直接校验整个数据文件夹的方法来确定数据是否有误. 1.针对整个文件夹生成md5校验文件方法: 以data文件夹为例,我们需要得到d ...
- NCBI SRA数据如何进行md5校验?
下了一些sra数据库中的公共数据,因为pretech和aspera不稳定,稍微大点的文件经常传断,部分文件我只能通过本地下载再上传. 那么问题来了,sra没有md5校验,我怎么知道我数据的完整性,尤其 ...
随机推荐
- 一文带您了解5G的价值与应用
一文带您了解5G的价值与应用 5G最有趣的一点是:大多数产品都是先有明确应用场景而后千呼万唤始出来.而5G则不同,即将到来的5G不仅再一次印证了科学技术是第一生产力还给不少用户带来了迷茫——我们为什么 ...
- JSCH实现文件上传下载至sftp服务器
文件服务器采用FreeSSHd,文件服务器配置就不细说了. 直接上代码,该代码可以直接使用. import com.jcraft.jsch.*; import java.io.InputStream; ...
- HTML5 Canvas绘制的下雪效果
在HTML页面的HEAD区域直接引入snow.js即可,如下:<script type="text/javascript" src="js/snow.js" ...
- Codeforces Round #468 (Div. 2, based on Technocup 2018 Final Round)C. Laboratory Work
Anya and Kirill are doing a physics laboratory work. In one of the tasks they have to measure some v ...
- springboot使用aop做日志
一.引入jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...
- IOS让自定义类是用下标
在ios中,有个非常有用的特性,就是可以为自己写的类增加下标访问功能. 如果我们自己的类中有个数组items,我们想直接给类加下标的方式来访问这个数组的元素,就像访问系统的数组一样,其实只要增加一个方 ...
- NFS学习
linux下搭建nfs服务: NFS是network filesystem的缩写,它可以通过网络,让不同的机器.不同的操作系统共享文件. NFS支持的功能比较多,默认端口也是随机的,基于远程调用服务( ...
- tomcat 内存溢出问题(OutOfMemoryError: PermGen space)
导入公司项目的时候出现的问题,在此记录处理方法. tomcat在启动的时候报错:OutOfMemoryError: PermGen space PermGen space的全称是Permanent G ...
- Spring 让 LOB 数据操作变得简单易行
概述 LOB 代表大对象数据,包括 BLOB 和 CLOB 两种类型,前者用于存储大块的二进制数据,如图片数据,视频数据等,而后者用于存储长文本数据,如论坛的帖子内容,产品的详细描述等.值得注意的是: ...
- Solr 搜索的过程和所须要的參数
一个典型的搜索处理过程,以及所须要的參数例如以下: qt:指定一个RequestHandler,即/select.缺省是使用DisMax RequestHandler defType:选择一个quer ...
