获取md5值4个步骤:
1.创建MessageDigest对象md5。
2.使用md的update(byte[] buffer)方法将数据更新到md5对象中。
3.使用md5的digest()方法获得摘要,该摘要是一个长度为16的数组。
4.将该摘要数组转换为32位的md5值.
注意:如果要获得16位的md5值就是取32位的md5值的中间16位。可以使用subString(8,24)截取。
以下是获得文件和字符串md5的方法,去除main方法即可作为一个工具类。
package com.wenba1314.tools;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Tool {
private static MessageDigest md;
static {
try {
//初始化摘要对象
md = MessageDigest.getInstance("md5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
System.out.println(generateMD5ForString("test"));
System.out.println(generateMD5ForFile(new File("1.jpg")));
}
//获得字符串的md5值
public static String generateMD5ForString(String str){
//更新摘要数据
md.update(str.getBytes());
//生成摘要数组
byte[] digest = md.digest();
//清空摘要数据,以便下次使用
md.reset();
return formatByteArrayTOString(digest);
}
//获得文件的md5值
public static String generateMD5ForFile(File file) throws IOException {
//创建文件输入流
FileInputStream fis = new FileInputStream(file);
//将文件中的数据写入md对象
byte[] buffer = new byte[1024];
int len=-1;
while ((len = fis.read(buffer)) != -1) {
md.update(buffer, 0, len);
}
fis.close();
//生成摘要数组
byte[] digest = md.digest();
//清空摘要数据,以便下次使用
md.reset();
return formatByteArrayTOString(digest);
}
//将摘要字节数组转换为md5值
public static String formatByteArrayTOString(byte[] digest) {
//创建sb用于保存md5值
StringBuffer sb = new StringBuffer();
int temp;
for (int i=0;i<digest.length;i++) {
//将数据转化为0到255之间的数据
temp=digest[i]&0xff;
if (temp < 16) {
sb.append(0);
}
//Integer.toHexString(temp)将10进制数字转换为16进制
sb.append(Integer.toHexString(temp));
}
return sb.toString();
}
}