MD5简介
MD5,Message Digest Algorithm 5,是一种被广泛使用的信息摘要算法,可以将给定的任意长度数据通过一定的算法计算得出一个128位
二进制的
散列值。
【Java|java String计算MD5的三种方法以及文件计算MD5的方法】常见的表示方法是将128位二进制转成32位16进制,这样看起来比较简短。
方法1
这种方法要注意一点的是不足32位高位需补零,否则会不足位,比如:
6531经MD5计算后正确的结果为0a7d83f084ec258aefd128569dda03d7
用方法1如果不高位补零返回的结果为a7d83f084ec258aefd128569dda03d7,前面的0少了
public static String MD51(String input) {
if(input == null || input.length() == 0) {
return null;
}
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(input.getBytes());
byte[] byteArray = md5.digest();
BigInteger bigInt = new BigInteger(1, byteArray);
// 参数16表示16进制
String result = bigInt.toString(16);
// 不足32位高位补零
while(result.length() < 32) {
result = "0" + result;
}
return result;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
方法2
public static String MD52(String input) {
if(input == null || input.length() == 0) {
return null;
}
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(input.getBytes());
byte[] byteArray = md5.digest();
char[] hexDigits = {'0','1','2','3','4','5','6','7','8','9', 'a','b','c','d','e','f'};
// 一个字节对应两个16进制数,所以长度为字节数组乘2
char[] charArray = new char[byteArray.length * 2];
int index = 0;
for (byte b : byteArray) {
charArray[index++] = hexDigits[b>>>4 & 0xf];
charArray[index++] = hexDigits[b & 0xf];
}
return new String(charArray);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
方法3
private static String MD53(String input) {
if(input == null || input.length() == 0) {
return null;
}
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(input.getBytes());
byte[] byteArray = md5.digest();
StringBuilder sb = new StringBuilder();
for (byte b : byteArray) {
// 一个byte格式化成两位的16进制,不足两位高位补零
sb.append(String.format("%02x", b));
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
计算文件的MD5值
任何文件都可以计算MD5值,因为任何文件实际上就是字节数组
public static String fileToMD5(String path){
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
FileInputStream fis = new FileInputStream(path);
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
md5.update(buffer, 0, len);
}
fis.close();
byte[] byteArray = md5.digest();
StringBuilder sb = new StringBuilder();
for (byte b : byteArray) {
sb.append(String.format("%02x", b));
}
return sb.toString();
} catch (IOException | NoSuchAlgorithmException e){
e.printStackTrace();
}
return null;
}
大写的MD5
以上三种方法返回的MD5值包含的字母都是小写的,如果想返回大写的直接在方法返回前用toUpperCase就可以了,不再赘述
public static String MD5(String input) {
// 省略计算MD5代码
return result.toUpperCase();
}
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)