1 package io.bigdata; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.security.MessageDigest; 8 import java.security.NoSuchAlgorithmException; 9 import java.security.Provider; 10 import java.security.Security; 11 import java.util.HashSet; 12 import java.util.Iterator; 13 import java.util.Set; 14 15 import org.apache.commons.codec.digest.DigestUtils; 16 17 public class Md5CaculateUtil { 18 19 private Md5CaculateUtil(){ 20 21 } 22 23 private static char[] hexChar = { 24 '0','1','2','3','4','5','6','7','8','9', 25 'a','b','c','d','e','f' 26 }; 27 28 public static String getHash(String fileName,String hashType) throws IOException, NoSuchAlgorithmException{ 29 30 File f = new File(fileName); 31 System.out.println(" -------------------------------------------------------------------------------"); 32 System.out.println("|當前文件名稱:"+f.getName()); 33 System.out.println("|當前文件大小:"+(f.length()/1024/1024)+"MB"); 34 System.out.println("|當前文件路徑[絕對]:"+f.getAbsolutePath()); 35 System.out.println("|當前文件路徑[---]:"+f.getCanonicalPath()); 36 System.out.println(" -------------------------------------------------------------------------------"); 37 38 InputStream ins = new FileInputStream(f); 39 40 byte[] buffer = new byte[8192]; 41 MessageDigest md5 = MessageDigest.getInstance(hashType); 42 43 int len; 44 while((len = ins.read(buffer)) != -1){ 45 md5.update(buffer, 0, len); 46 } 47 48 ins.close(); 49 // 也可以用apache自帶的計算MD5方法 50 return DigestUtils.md5Hex(md5.digest()); 51 // 自己寫的轉計算MD5方法 52 // return toHexString(md5.digest()); 53 } 54 55 public static String getHash2(String fileName){ 56 File f = new File(fileName); 57 return String.valueOf(f.lastModified()); 58 } 59 60 61 protected static String toHexString(byte[] b){ 62 StringBuilder sb = new StringBuilder(b.length*2); 63 for(int i=0;i<b.length;i++){ 64 sb.append(hexChar[(b[i] & 0xf0) >>> 4]); 65 sb.append(hexChar[b[i] & 0x0f]); 66 } 67 return sb.toString(); 68 } 69 70 /* 71 * 獲取MessageDigest支持幾種加密算法 72 */ 73 @SuppressWarnings({ "rawtypes", "unchecked" }) 74 private static String[] getCryptolmpls(String serviceType){ 75 76 Set result = new HashSet(); 77 // all providers 78 Provider[] providers = Security.getProviders(); 79 for(int i=0;i<providers.length;i++){ 80 // get services provided by each provider 81 Set keys = providers[i].keySet(); 82 for(Iterator it = keys.iterator();it.hasNext();){ 83 String key = it.next().toString(); 84 key = key.split(" ")[0]; 85 86 if(key.startsWith(serviceType+".")){ 87 result.add(key.substring(serviceType.length()+1)); 88 }else if(key.startsWith("Alg.Alias."+serviceType+".")){ 89 result.add(key.substring(serviceType.length()+11)); 90 } 91 } 92 } 93 return (String[]) result.toArray(new String[result.size()]); 94 } 95 96 97 public static void main(String[] args) throws Exception, Exception { 98 // 調用方法 99 // String[] names = getCryptolmpls("MessageDigest"); 100 // for(String name:names){ 101 // System.out.println(name); 102 // } 103 long start = System.currentTimeMillis(); 104 System.out.println("開始計算文件MD5值,請稍后..."); 105 String fileName = "E:\\Office_2010_Toolkit_2.2.3_XiaZaiBa.zip"; 106 //// String fileName = "E:\\SoTowerStudio-3.1.0.exe"; 107 String hashType = "MD5"; 108 String hash = getHash(fileName,hashType); 109 System.out.println("MD5:"+hash); 110 long end = System.currentTimeMillis(); 111 System.out.println("一共耗時:"+(end-start)+"毫秒"); 112 } 113 }
開始計算文件MD5值,請稍后...
-------------------------------------------------------------------------------
|當前文件名稱:Office_2010_Toolkit_2.2.3_XiaZaiBa.zip
|當前文件大小:2437MB
|當前文件路徑[絕對]:E:\Office_2010_Toolkit_2.2.3_XiaZaiBa.zip
|當前文件路徑[---]:E:\Office_2010_Toolkit_2.2.3_XiaZaiBa.zip
-------------------------------------------------------------------------------
MD5:b1d269391c87942e5bb32b575baa0d79
一共耗時:18794毫秒