<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    ice world

    There is nothing too difficult if you put your heart into it.
    posts - 104, comments - 103, trackbacks - 0, articles - 0

    Java MD5校驗工具類

    Posted on 2012-06-01 17:57 IceWee 閱讀(3498) 評論(1)  編輯  收藏 所屬分類: Java加解密
    之前使用到了NIO的FileChannel做文件快速閱讀,后來發現存在一個巨大的BUG,使用它會一直不釋放文件句柄,即生成MD5的文件不能操作(移動或刪除等),這個BUG網上吵得沸沸揚揚,至今沒有解決,畢竟是SUN的BUG,解鈴還需系鈴人啊!咱只好乖乖的使用文件分塊讀取的方法,這種方式要求生成MD5和驗證的時候得使用相同的緩存大小。
    MD5Utils.java
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.nio.MappedByteBuffer;
    import java.nio.channels.FileChannel;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;

    /**
     * <p>
     * MD5工具類
     * </p>
     * 
     * 
    @author IceWee
     * @date 2012-5-15
     * 
    @version 1.0
     
    */

    public class MD5Utils {
        
        
    private static final String ALGORIGTHM_MD5 = "MD5";
        
    private static final int CACHE_SIZE = 2048;
        
        
    /**
         * <p>
         * 字符串生成MD5
         * </p>
         * 
         * 
    @param input
         * 
    @return
         * 
    @throws Exception
         
    */

        
    public static String createMD5(String input) throws Exception {
            
    return createMD5(input, null);
        }

        
        
    /**
         * <p>
         * 字符串生成MD5
         * </p>
         * 
         * 
    @param input
         * 
    @param charset 編碼(可選)
         * 
    @return
         * 
    @throws Exception
         
    */

        
    public static String createMD5(String input, String charset) throws Exception {
            
    byte[] data;
            
    if (charset != null && !"".equals(charset)) {
                data 
    = input.getBytes(charset);
            }
     else {
                data 
    = input.getBytes();
            }

            MessageDigest messageDigest 
    = getMD5();
            messageDigest.update(data);
            
    return byteArrayToHexString(messageDigest.digest());
        }

        
        
    /**
         * <p>
         * 生成文件MD5
         * </p>
         * <p>
         * 該方法中使用的FileChannel存在一個巨大Bug,不釋放文件句柄,即生成MD5的文件無法操作(移動或刪除等)<br>
         * 該方法已被generateFileMD5取代
         * </p>
         * 
         * 
    @param filePath
         * 
    @return
         * 
    @throws Exception
         
    */

        @Deprecated
        
    public static String createFileMD5(String filePath) throws Exception {
            String md5 
    = "";
            File file 
    = new File(filePath);
            
    if (file.exists()) {
                MessageDigest messageDigest 
    = getMD5();
                FileInputStream in 
    = new FileInputStream(file);
                FileChannel fileChannel 
    = in.getChannel();
                MappedByteBuffer byteBuffer 
    = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
                messageDigest.update(byteBuffer);
                fileChannel.close();
                in.close();
                
    byte data[] = messageDigest.digest();
                md5 
    = byteArrayToHexString(data);
             }

            
    return md5;
        }

        
        
    /**
         * <p>
         * 生成文件MD5值
         * <p>
         * <p>
         * 在進行文件校驗時,文件讀取的緩沖大小[CACHE_SIZE]需與該方法的一致,否則校驗失敗
         * </p>
         * 
         * 
    @param filePath
         * 
    @return
         * 
    @throws Exception
         
    */

        
    public static String generateFileMD5(String filePath) throws Exception {
            String md5 
    = "";
            File file 
    = new File(filePath);
            
    if (file.exists()) {
                MessageDigest messageDigest 
    = getMD5();
                InputStream in 
    = new FileInputStream(file);
                
    byte[] cache = new byte[CACHE_SIZE];
                
    int nRead = 0;
                
    while ((nRead = in.read(cache)) != -1{
                    messageDigest.update(cache, 
    0, nRead);
                }

                in.close();
                
    byte data[] = messageDigest.digest();
                md5 
    = byteArrayToHexString(data);
             }

            
    return md5;
        }

        
        
    /**
         * <p>
         * MD5摘要字節數組轉換為16進制字符串
         * </p>
         * 
         * 
    @param data MD5摘要
         * 
    @return
         
    */

        
    private static String byteArrayToHexString(byte[] data) {
            
    // 用來將字節轉換成 16 進制表示的字符
            char hexDigits[] = {
                    
    '0''1''2''3''4''5''6''7''8''9''a''b''c''d''e''f' 
            }
    ;
            
    // 每個字節用 16 進制表示的話,使用兩個字符,所以表示成 16 進制需要 32 個字符
            char arr[] = new char[16 * 2];
            
    int k = 0// 表示轉換結果中對應的字符位置
            
    // 從第一個字節開始,對 MD5 的每一個字節轉換成 16 進制字符的轉換
            for (int i = 0; i < 16; i++{
                
    byte b = data[i]; // 取第 i 個字節
                
    // 取字節中高 4 位的數字轉換, >>>為邏輯右移,將符號位一起右移
                arr[k++= hexDigits[b >>> 4 & 0xf];
                
    // 取字節中低 4 位的數字轉換
                arr[k++= hexDigits[b & 0xf];
            }

            
    // 換后的結果轉換為字符串
            return new String(arr);
        }

        
        
    /**
         * <p>
         * 獲取MD5實例
         * </p>
         * 
         * 
    @return
         * 
    @throws NoSuchAlgorithmException 
         
    */

        
    private static MessageDigest getMD5() throws NoSuchAlgorithmException {
            
    return MessageDigest.getInstance(ALGORIGTHM_MD5);
        }

        
    }




    Feedback

    # re: Java MD5校驗工具類  回復  更多評論   

    2013-09-09 17:53 by 富商大賈
    啊豐富的
    主站蜘蛛池模板: 亚洲精品中文字幕无乱码| 国产亚洲美女精品久久久2020| 亚洲日本一区二区| 日本免费中文视频| 亚洲国产美国国产综合一区二区| 成人A毛片免费观看网站| 精品国产香蕉伊思人在线在线亚洲一区二区| 亚洲aⅴ天堂av天堂无码麻豆| 日本免费一区尤物| 青青青亚洲精品国产| 亚洲国产婷婷香蕉久久久久久| 美女裸体无遮挡免费视频网站| 亚洲精品色婷婷在线影院| 香蕉视频在线免费看| 亚洲国产精品无码久久久不卡| 一区二区三区福利视频免费观看| 亚洲精品线在线观看| 国产精品久久久久免费a∨| 亚洲av永久无码精品网址| 婷婷亚洲天堂影院| 久久性生大片免费观看性| 精品亚洲A∨无码一区二区三区| 国产精品久久永久免费| 亚洲日韩精品无码AV海量| 亚洲国产成人久久综合野外| 三根一起会坏掉的好痛免费三级全黄的视频在线观看 | 爱情岛论坛网亚洲品质自拍| 亚洲五月午夜免费在线视频| 久久久久亚洲精品无码系列| av大片在线无码免费| 春暖花开亚洲性无区一区二区 | 亚洲人成网站18禁止| 亚洲精品国产精品乱码不卞 | www.亚洲色图| 久久久久久久久久国产精品免费| 成人亚洲国产va天堂| 亚洲国产精品一区二区九九| 最近2019免费中文字幕视频三| 国产精品无码亚洲精品2021| 亚洲AV人无码综合在线观看| 免费看大黄高清网站视频在线|