<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做文件快速閱讀,后來發(fā)現(xiàn)存在一個巨大的BUG,使用它會一直不釋放文件句柄,即生成MD5的文件不能操作(移動或刪除等),這個BUG網(wǎng)上吵得沸沸揚揚,至今沒有解決,畢竟是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>
         * 在進(jìn)行文件校驗時,文件讀取的緩沖大小[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摘要字節(jié)數(shù)組轉(zhuǎn)換為16進(jìn)制字符串
         * </p>
         * 
         * 
    @param data MD5摘要
         * 
    @return
         
    */

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

            
    // 換后的結(jié)果轉(zhuǎn)換為字符串
            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校驗工具類  回復(fù)  更多評論   

    2013-09-09 17:53 by 富商大賈
    啊豐富的
    主站蜘蛛池模板: 亚洲日韩精品无码专区网站 | 国产亚洲视频在线观看网址| 亚洲AV乱码久久精品蜜桃 | 亚洲色成人网一二三区| 亚洲国产成人久久一区WWW| 欧美好看的免费电影在线观看| 美女在线视频观看影院免费天天看 | 美女被免费网站在线视频免费 | 2021国内精品久久久久精免费| 两个人看的www免费| 国产区图片区小说区亚洲区| 亚洲综合av一区二区三区| 亚洲天堂一区二区三区四区| 亚洲AV无码不卡在线播放| 久久亚洲国产成人影院网站| 亚洲第一区精品日韩在线播放| 四虎影视在线永久免费看黄| 成人免费视频观看无遮挡| 美女视频黄的全免费视频网站| 91在线手机精品免费观看| 久久精品免费一区二区三区| 一级特黄录像免费播放肥| 日本一区二区三区在线视频观看免费 | 亚洲精品宾馆在线精品酒店 | 好男人看视频免费2019中文| 成年大片免费视频| 99精品国产免费久久久久久下载| 麻豆高清免费国产一区| 亚洲最大免费视频网| 亚洲成人免费在线观看| 最近免费字幕中文大全视频| 麻花传媒剧在线mv免费观看| 国产a视频精品免费观看| xxxxx免费视频| 免费不卡视频一卡二卡| 毛片高清视频在线看免费观看| 中文字幕无码不卡免费视频| 成人激情免费视频| 日韩成人免费视频播放| 亚洲AV无码乱码在线观看牲色| 青青青国产色视频在线观看国产亚洲欧洲国产综合 |