`
kobe学java
  • 浏览: 249808 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

java md5

    博客分类:
  • java
 
阅读更多

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 算法。我再把封装一下:

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

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

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

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics