class MD5Util { private static MessageDigest messagedigest = null; private static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9','a', 'b', 'c', 'd', 'e', 'f' }; public MD5Util() { try{ messagedigest = MessageDigest.getInstance("MD5"); } catch(Exception e) { System.err.println(MD5Util.class.getName()+"初始化失败,MessageDigest不支持MD5Util。"); e.printStackTrace(); } } String getFileMD5(File f) { FileInputStream in = null; try { in = new FileInputStream(f); byte[] buffer = new byte[8192]; int length; int total = 0; while ((length = in.read(buffer)) != -1) { messagedigest.update(buffer, 0, length); total += length; /* 只针对前10M内容来计算md5值, 已经够用了 */ if (total > (10*1024*1024)) { break; } } return bufferToHex(messagedigest.digest()); } catch (FileNotFoundException e) { System.out.println("exception file: " + f.getAbsolutePath()); System.out.println("exception length: " + f.length()); e.printStackTrace(); return null; } catch (IOException e) { System.out.println("exception file: " + f.getAbsolutePath()); System.out.println("exception length: " + f.length()); e.printStackTrace(); return null; } finally { try { if (in != null) in.close(); } catch (IOException e) { e.printStackTrace(); } } }
/* 仅支持小文件,当文件较大时,会因为ch.map过程中内存不足而失败 */ String getMD5(File f) { String value = null; try { FileInputStream in = new FileInputStream(f); FileChannel ch = in.getChannel(); MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0, f.length()); MessageDigest messagedigest = MessageDigest.getInstance("MD5"); messagedigest.update(byteBuffer); BigInteger bi = new BigInteger(1, messagedigest.digest()); value = bi.toString(16); } catch (Exception e) { System.out.println("exception file: " + f.getAbsolutePath()); System.out.println("exception length: " + f.length()); e.printStackTrace(); } return value; } 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); } }