生成字符串和文件的MD5
生成字符串和文件的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(); } } }