String s="abc";
java.security.MessageDigest md=java.security.MessageDigest.getInstance("MD5");
md.update(s.getBytes());
byte[] digest=md.digest();

解决方案 »

  1.   

    首先用生成一个MessageDigest类,确定计算方法java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1");添加要进行计算摘要的信息alga.update(myinfo.getBytes());计算出摘要byte[] digesta=alga.digest();发送给其他人你的信息和摘要其他人用相同的方法初始化,添加信息,最后进行比较摘要是否相同algb.isEqual(digesta,algb.digest())相关AIPjava.security.MessageDigest 类static getInstance(String algorithm)返回一个MessageDigest对象,它实现指定的算法参数:算法名,如 SHA-1 或MD5void update (byte input)void update (byte[] input)void update(byte[] input, int offset, int len)添加要进行计算摘要的信息byte[] digest()完成计算,返回计算得到的摘要(对于MD5是16位,SHA是20位)void reset()复位static boolean isEqual(byte[] digesta, byte[] digestb)比效两个摘要是否相同代码: 
    import java.security.*;
    public class myDigest {
     public static void main(String[] args)  {   myDigest my=new myDigest();
       my.testDigest(); }
     public void testDigest()
     {
      try {
        String myinfo="我的测试信息";   //java.security.MessageDigest alg=java.security.MessageDigest.getInstance("MD5");
         java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1");
         alga.update(myinfo.getBytes());
         byte[] digesta=alga.digest();
         System.out.println("本信息摘要是:"+byte2hex(digesta));
         //通过某中方式传给其他人你的信息(myinfo)和摘要(digesta) 对方可以判断是否更改或传输正常
         java.security.MessageDigest algb=java.security.MessageDigest.getInstance("SHA-1");
         algb.update(myinfo.getBytes());
         if (algb.isEqual(digesta,algb.digest())) {
            System.out.println("信息检查正常");
          }
          else
           {
             System.out.println("摘要不相同");
            }  }
      catch (java.security.NoSuchAlgorithmException ex) {
        System.out.println("非法摘要算法");
      } }
     public String byte2hex(byte[] b) //二行制转字符串
       {
        String hs="";
        String stmp="";
        for (int n=0;n<b.length;n++)
         {
          stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));
          if (stmp.length()==1) hs=hs+"0"+stmp;
          else hs=hs+stmp;
          if (n<b.length-1)  hs=hs+":";
         }
        return hs.toUpperCase();
       }}
      

  2.   

    难道要把整个文件读到内存缓冲区,再toString()用这种方法来作?太麻烦了吧~~~
      

  3.   

    学习呢-----------------------------------------------
         .,,,::::t:MMMMMMMMMBVt:+.. 
       ,IVXVYIBttt+::+IVVMMMMMMRR:’ 
       ,YYVYItMYti+i++:X+Rt:tXWRMR, 
       .YRiIYRMViitVXRWRYMI++++itMM.. 
       .Y+,.,X::,,,YMMMMMMMMRVItXMti 
        :X+:,X:,. .,iiIRMWMMMBBRMMBY. 
        tR+:I:i:+Y:IitYVYMMMMMMMMRi. 
        .+RXt:,::.::XXIBMMMMMMMMM+: 
         ,RRXitY+,.::RWMMMMMMMMt. 
          VYI:::,..:tVMMMMMMBY+. 
          .VBBW:::::,i.MMMMMBi:. 
          .tWRRVi:::.X:VMMMMMMY. 
         ,+i+:,XYtt+:,i:,MMMBR: 
      ...VV..:..:.tt::++:+,RMYMV. 
     :M:::..:,.:,,,.+t+++Ytt.,+: 
    tRt:,.:,.:,:.:+.,:++tit, 
    :tXt:,:,:.:.,,+,:+YRY, 
     :++:::.,:.:.::+:iMi 
      ,Ri:::,:::::::+Ii 
      ,+:Xii:,,::I:tit,. 
       :BBt,:+::,::i+. 
       :BWXX::::::iX. 
       :BWVIi++t+:V+ 
       WBXtItii+iWI. 
       :MWIYIti+iVRY, 
        RBXVYItiiIYXWI, 
        :MRWWVYttttIIXWt. 
        .XMBRRXIti++itIXW, 
        .BMBBRVIi+::+ttXX. 
         ,MMBRXYti:::+tIW: 
         tMMRWYti+++ittXV 
          +MRVYti+++ittWI 
         .VMWVtiiiiiitIR, 
         .XBBWVttttttttXRv 
        .,WBRBXVtttttttIWt 
        :RWXWBXYtttttttYR: 
       .iRWVIiBWYIttttttYW, 
      .tWVYti:WRVIttittIVV   .:,, 
      tWVIi++:XRVIIttttIXY  ..:YYtYi:tittV, 
      tXYti+++tWRVYttittYWIiIYYVItt:iXW+.... 
     :WIt+++iXRBBVYItitIYXXYti+iIYt++:IMRi:. 
    .:Xti+:+tRWt:BVYItitIYWVIIIYXXWXVXYt+i+IV: 
    .tYi+::IWI:::BVVItitIXBRVIt:::::::tIVXRiXt 
    :Viii++i:itIXBXVttitVW,        tBIX 
    .XIiXIttIVRBRBIItttIRX         :VX 
    .,tXXWWWVi+. RXXItiYRV         .. 
           ,BWYi+IRX 
           tBYiitWB, 
           .WVtiiIRI 
            VWtiiiIB, 
            ,BIiiiiWt 
            .BViiiiYV 
            XXtii+YV 
            iRiii+YY 
            :Btii+XI 
             Wtii+R: 
             XY+t+B. 
             YX+tYR. 
             tX+iWV 
             iXi+RI 
             tYiIXX 
            ,XtiIXRt. 
            :BIVYRWIV 
            +RYXXWiYR. 
            iWIVYtXMV 
            tBYItRtM+ 
            XBWttX:B: 
           YYBXXYR:,R: 
           tIYYYIY: i
      

  4.   

    同意newman0708(nch) 的观点还有一点就是md5加密后是无法可逆的所以对文件进行加密有什么用途?
      

  5.   

    我并不想做加密,只是想比较两个文件是否相同。由于这两个文件是在网络中不同的计算机上,所以逐个字节读取再比较不太可行,于是考虑对于每个文件生成一个MD5 MessageDigest,再比较MessageDigest即可。虽然MD5本不是用来比较这个的,但一时想不出什么别的好办法~~~~~~主要是对于一个特定的文件,如何生成MessageDigest?
    Thank you!
      

  6.   

    生成特定文件的MessageDigest:
        try{
          MessageDigest md5 = MessageDigest.getInstance("MD5");
          FileInputStream fis=new FileInputStream(filename);
          byte b;
          while(fis.available()!=0){
            b=(byte)fis.read();
            md5.update(b);
          }
          fis.close();
          byte[] digest=md5.digest();
          StringBuffer hexString = new StringBuffer();
          for (int i=0;i<digest.length;i++) {
            hexString.append(
              Integer.toHexString(0xFF & digest[i]));
            hexString.append(" ");
          }
          System.out.println(hexString.toString());    }
        catch(NoSuchAlgorithmException ie){
          ie.printStackTrace();
        }
      

  7.   

    上面那种方法有点慢,稍微改一下:
          MessageDigest md5 = MessageDigest.getInstance("MD5");
          FileInputStream fis=new FileInputStream(filename);
          DigestInputStream in=new DigestInputStream(fis,md5);   //!!!
          byte[] buffer=new byte[5120];
          while(in.read(buffer)!=-1);     //!!!
          in.close();
          fis.close();
          byte[] digest=md5.digest();
          StringBuffer hexString = new StringBuffer();
          for (int i=0;i<digest.length;i++) {
            hexString.append(
              Integer.toHexString(0xFF & digest[i]));
          }
          String result=hexString.toString();result中就是该文件的digest
      

  8.   

    ===========
          for (int i=0;i<digest.length;i++) {
            hexString.append(
              Integer.toHexString(0xFF & digest[i]));
          }
          String result=hexString.toString();
    ===========
    你好,这样输出,如果高位为0就不显示了,怎么办?