java md5

Broadview 2012-02-29

java md5

发表于:2009年6月19日 | 分类:算法 | 标签: md5 | views(1,739)

版权信息: 可以任意转载, 转载时请务必以超链接形式标明文章原文出处, 即下面的声明.

原文出处:http://blog.chenlb.com/2009/06/java-md5.html

java 版简易 md5 实现。我早期的 blog 记录过 md5 的java 实现(包括了算法),比较复杂:http://www.blogjava.net/chenlb/articles/83367.html。最近写的程序与 md5 相关,自一个方法的 md5 方便的类吧,看到了 使用 Java 生成 MD5 编码。其实sun本身实现了 md5 算法。我再把封装一下:

package com.chenlb;  
  
import java.nio.charset.Charset;  
import java.security.MessageDigest;  
import java.security.NoSuchAlgorithmException;  
  
/** 
 * java md5 
 * 
 * @author chenlb 2009-6-19 上午11:46:38 
 */  
public class MD5 {  
    private MessageDigest md5;  
    private char hexDigits[] = {       // 用来将字节转换成 16 进制表示的字符  
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd',  'e', 'f'};  
    public MD5() {  
        try {  
            md5 = MessageDigest.getInstance("MD5");  
        } catch (NoSuchAlgorithmException e) {  
            throw new RuntimeException("no such md5 algorithm!", e);  
        }  
    }  
  
    public String hexString(byte[] source) {  
        byte[] bs = md5.digest(source);  
        char str[] = new char[16 * 2];   // 每个字节用 16 进制表示的话,使用两个字符,  
        // 所以表示成 16 进制需要 32 个字符  
        int k = 0;                                // 表示转换结果中对应的字符位置  
        for (int i = 0; i < 16; i++) {          // 从第一个字节开始,对 MD5 的每一个字节  
            // 转换成 16 进制字符的转换  
            byte byte0 = bs[i];                 // 取第 i 个字节  
            str[k++] = hexDigits[byte0 >>> 4 & 0xf];  // 取字节中高 4 位的数字转换,  
            // >>> 为逻辑右移,将符号位一起右移  
            str[k++] = hexDigits[byte0 & 0xf];            // 取字节中低 4 位的数字转换  
        }  
        return new String(str);  
    }  
  
    public String hexString(String source, Charset charset) {  
        String md5Str = "";  
        md5Str = hexString(source.getBytes(charset));  
        return md5Str;  
    }  
  
    public static void main(String[] args) {  
        MD5 md5 = new MD5();  
        //c2e5848ee99554aae35c090e581cd63c  
        System.out.println(md5.hexString("blog.chenlb.com", Charset.forName("UTF-8")));  
    }  
}  

当然还可以像在 haogj 博客里的回复提到的那样,可以用 String.format("%02X", b)) ,但后来发现慢,不是一个数量级的,100倍的差距。可以换 hexString(byte[] source) 方法内容,试试:

public String hexString(byte[] source) {  
    byte[] bs = md5.digest(source);  
    StringBuilder sb = new StringBuilder();  
    for (int i = 0; i<bs.length; i++) {  
        String s = String.format("%02X", bs[i]);  
        sb.append(s);  
    }  
    return sb.toString();  

相关推荐