MD5算法是一种消息摘要,用于提供消息的完整性保护。
一 其实就是为了保护文件传输的完整性,比如我们从网上下载的文件,如果其在传输过程中被篡改过的话,则我们所下载下来的文件的md5值和源文件肯定是不一样的。
二 涉及到我们的android项目里的话,就是app在进行版本升级的时候,我们需要计算我们下载文件的md5值与服务器该文件的md5值进行比较,如果一样则代表文件是完整的且没有被修改过,反之则说明文件不完整,我们就需要重新下载一份。
接下来我们贴出关于文件和字符串MD5值计算的相关代码:
package com.example.asiatravel.md5demo;
import android.util.Log;
import java.io.FileInputStream;
import java.security.DigestInputStream;
import java.security.MessageDigest;
/**
* Created by kuangxiaoguo on 16/9/6.
*/
public class MessageDigestUtil {
private static final String TAG = "TAG";
/**
* 计算字符串的MD5值
*
* @param data 要计算的字符串对应的字节数组
* @return 字符串的MD5值
*/
public static String encryptMD5(byte[] data) {
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(data);
byte[] resultBytes = md5.digest();
/*
将字节数组转化为16进制
*/
return ByteToHexUtil.fromByteToHex(resultBytes);
} catch (Exception e) {
Log.d(TAG, "encryptMD5: " + e.getMessage());
}
return null;
}
/**
* 计算文件的MD5值
*
* @param path 文件路径
* @return 文件MD5值
*/
public static String getFileMD5(String path) {
try {
FileInputStream fileInputStream = new FileInputStream(path);
DigestInputStream dis = new DigestInputStream(fileInputStream, MessageDigest.getInstance("MD5"));
byte[] buffer = new byte[1024];
int read = dis.read(buffer, 0, 1024);
while (read != -1) {
read = dis.read(buffer, 0, 1024);
}
dis.close();
fileInputStream.close();
MessageDigest md5 = dis.getMessageDigest();
return ByteToHexUtil.fromByteToHex(md5.digest());
} catch (Exception e) {
Log.d(TAG, "getFileMD5: " + e.getMessage());
}
return null;
}
}
然后是把字节数组转化为16进制的工具类:
package com.example.asiatravel.md5demo;
/**
* Created by kuangxiaoguo on 16/9/6.
* <p/>
* 将字节数组转化为16进制的工具类
*/
public class ByteToHexUtil {
public static String fromByteToHex(byte[] resultBytes) {
StringBuilder builder = new StringBuilder();
for (byte resultByte : resultBytes) {
if (Integer.toHexString(0xFF & resultByte).length() == 1) {
builder.append(0).append(Integer.toHexString(0xFF & resultByte));
} else {
builder.append(Integer.toHexString(0xFF & resultByte));
}
}
return builder.toString();
}
}
总结:对于MD5值的计算并不难,但是要理解每行代码到底是什么意思,而不是死记代码,这样对于我们才有真正的提高。另外如果大家有那里不明白的地方可以留言或者发
邮件[email protected],这样我们可以共同提高。