<<首先声明本文内容有参考网上资源,文章开头我首先要向他们表示感谢,众包力量无穷啊>>
之前学过《计算机安全》这门课,了解了MD5,不过没有自己具体实现过,今天讲的也只是调用java包中已提供的相关功能
MD5这个私有类
因为项目测试的需要,自己添加了个MD5私有类,用来检测原始文件内容和上传后被get下来的文件内容是否相同。代码贴下!
private class MD5 {
private MessageDigest md5;
private char hexDigits[] = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
public MD5() {
try {
md5 = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("no such md5 algorithm!", e);
}
}
public String getFileMD5(File file) {
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
byte[] buffer = new byte[8192];
int length;
while( (length = fis.read(buffer)) != -1) {
md5.update(buffer, 0, length);
}
return hexString(md5.digest());
} catch (FileNotFoundException e) {
logger.error("File<"+ file.getAbsolutePath() + "> not found");
return null;
} catch (IOException e) {
logger.error("MD5 file " + file.getAbsolutePath() + " failed:" + e.getMessage());
return null;
} finally {
try {
if (fis != null)
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public String hexString(byte[] source) {
char str[] = new char[16 * 2];
int k = 0;
for (int i = 0; i < 16; i++) {
byte byte0 = source[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
return new String(str);
}
}
代码应该是比较容易看懂的,一个私有成员md5,用于计算MD5值, 以及一个char数组,用于将得到的MD5值转换为十六进制(PS: md5值一般以十六进制表示,那到底是几位16进制呢?请看后面分析)。
1、构造函数就是根据提供的参数MD5对私有成员md5进行初始化
2、主要的方法就是根据传入的文件名file得到文件内容的MD5值(说过了,以16进制表示,String类型返回),当然,如果你要计算一段字符串的MD5,相应做修改即可,传参改为string, file那部分删掉之类的,比较简单啦
3、我们看到中间是调用md5.update操作,将文件内容以byte形式传入,最后通过md5.digest计算出MD5的byte数组,我们另外添加的辅助方法hexString就是用来将byte数组转换成字符串的,看到了吗,MD5是32位16进制数哦
提供了这个私有类作为工具,那么自己就可以利用到项目当中检测两个文件的MD5值是否相同了,这个不用说了吧,很easy不是?
第一次在CSDN上发篇博客,谢谢各位看官支持!可以留言哦~