生成字符串和文件的MD5
本文介绍如果根据字符串和文件内容生成MD5值:
- 根据字符串生成MD5
- 根据文件内容生成MD5
根据字符串生成MD5
根据输入的字符串生成与改字符串对应的MD5值。
实现
主程序strMD5,这里调用了bufferToHex将byte转为字符串
public static String strMD5(String strSrc) {
String md5Str = "";
try {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.reset();
byte[] bt = strSrc.getBytes();
messageDigest.update(bt);
md5Str = bufferToHex(messageDigest.digest());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return md5Str;
}
bufferToHex,将byte转为字符串
private static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e',
'f' };
private static String bufferToHex(byte bytes[]) {
return bufferToHex(bytes, 0, bytes.length);
}
private static String bufferToHex(byte bytes[], int m, int n) {
StringBuffer stringbuffer = new StringBuffer(2 * n);
int k = m + n;
for (int l = m; l < k; l++) {
appendHexPair(bytes[l], stringbuffer);
}
return stringbuffer.toString();
}
private static void appendHexPair(byte bt, StringBuffer stringbuffer) {
char c0 = hexDigits[(bt & 0xf0) >> 4];
char c1 = hexDigits[bt & 0xf];
stringbuffer.append(c0);
stringbuffer.append(c1);
}
根据文件内容生成MD5
根据文件的内容生成对应的MD5值。即便文件名称一致但是内容不同MD5值不同。
实现
主程序getFileMD5,利用BigInteger生成32位16进制数
private static int bufferSize = 256 * 1024;
private static FileInputStream fileInputStream = null;
private static DigestInputStream digestInputStream = null;
public static String getFileMD5String(File file) throws IOException {
if (!file.isFile()) {
return null;
}
try {
MessageDigest messageDigest =MessageDigest.getInstance("MD5");
fileInputStream = new FileInputStream(file);
digestInputStream = new DigestInputStream(fileInputStream,messageDigest);
byte[] buffer =new byte[bufferSize];
while (digestInputStream.read(buffer) > 0);
messageDigest= digestInputStream.getMessageDigest();
byte[] resultByteArray = messageDigest.digest();
BigInteger bigInt = new BigInteger(1, resultByteArray);
String md5 = bigInt.toString(16);
int length = md5.length();
for (int i = 0; i < (32 - length); i++) {
md5 = 0 + md5;
}
return md5.toUpperCase();
// return bufferToHex(resultByteArray).toUpperCase();
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(digestInputStream!=null){
digestInputStream.close();
}
}
}