/** * Copyright (c) 2011-2014, hubin (243194995@qq.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.hepx.jgt.common.file; import org.hepx.jgt.common.encrypt.MD5; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.Provider; import java.security.Security; import java.util.HashSet; import java.util.Iterator; import java.util.Set; /** * 文件 Hash 帮助类 * * @author koala * @Date 2014-8-23 */ public class FileHashHelper { private final static Logger logger = LoggerFactory.getLogger(FileHashHelper.class); /** * 获取文件文件MD5 Hash值 * @param fileName 文件绝对地址 * @return * @throws java.security.NoSuchAlgorithmException * @throws java.io.IOException */ public static String getMD5Hash(String fileName) throws NoSuchAlgorithmException, IOException { return getHash(fileName, "MD5"); } /** * 获取文件文件MD5 Hash值 * @param ins 文件输入流 * @return * @throws java.io.IOException * @throws java.security.NoSuchAlgorithmException * */ public static String getMD5Hash(InputStream ins) throws NoSuchAlgorithmException, IOException { return getHash(ins, "MD5"); } /** * 获取文件文件Hash值 * <p/> * * @param pathName 文件绝对地址 * @param hashType MessageDigest 加密算法 * @return * @throws java.io.IOException * @throws java.security.NoSuchAlgorithmException * */ public static String getHash(String pathName, String hashType) throws IOException, NoSuchAlgorithmException { File f = new File(pathName); if(logger.isDebugEnabled()){ logger.debug(" -------------------------------------------------------------------------------"); logger.debug("|当前文件名称:" + f.getName()); logger.debug("|当前文件大小:" + (f.length() / 1024 / 1024) + "MB"); logger.debug("|当前文件路径[绝对]:" + f.getAbsolutePath()); logger.debug("|当前文件路径[---]:" + f.getCanonicalPath()); logger.debug("|当前文件最后一次被修改时间[---]:" + f.lastModified()); logger.debug(" -------------------------------------------------------------------------------"); } return getHash(new FileInputStream(f), hashType); } /** * 获取文件文件Hash值 * <p/> * * @param ins 文件输入流 * @param hashType MessageDigest 加密算法 * @return * @throws java.io.IOException * @throws java.security.NoSuchAlgorithmException * */ public static String getHash(InputStream ins, String hashType) throws IOException, NoSuchAlgorithmException { if (ins == null) { //输入流为空返回 null return null; } byte[] buffer = new byte[8192]; MessageDigest md5 = MessageDigest.getInstance(hashType); int len; while ((len = ins.read(buffer)) != -1) { md5.update(buffer, 0, len); } ins.close(); return MD5.byte2Hex(md5.digest()); } /** * 获取MessageDigest支持几种加密算法 * SHA-256 SHA-512 SHA SHA-384 SHA1 MD5 SHA-1 MD2 */ @SuppressWarnings({"rawtypes", "unchecked"}) private static String[] getCryptolmpls(String serviceType) { Set result = new HashSet(); //all providers Provider[] providers = Security.getProviders(); for (int i = 0; i < providers.length; i++) { //get services provided by each provider Set keys = providers[i].keySet(); for (Iterator it = keys.iterator(); it.hasNext(); ) { String key = it.next().toString(); key = key.split(" ")[0]; if (key.startsWith(serviceType + ".")) { result.add(key.substring(serviceType.length() + 1)); } else if (key.startsWith("Alg.Alias." + serviceType + ".")) { result.add(key.substring(serviceType.length() + 11)); } } } return (String[]) result.toArray(new String[result.size()]); } /* public static void main(String[] args) throws Exception { //MessageDigest 支持的加密算法 String[] names = getCryptolmpls("MessageDigest"); System.out.println("MessageDigest 支持的加密算法: "); for (String name : names) { System.out.println(name); } long start = System.currentTimeMillis(); System.out.println("开始计算文件MD5值,请稍后..."); System.out.println("MD5:" + getMD5Hash("E:/Office_Visio_Pro_2007.iso")); long end = System.currentTimeMillis(); System.out.println("一共耗时:" + (end - start) + "毫秒"); }*/ }