用java的MessageDigest类计算出字符串的MD5编码

         首先。要了解MD5编码的算法过程。

         下面是来自百度百科的介绍:对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

          我自己理解是这样的。不管是字符串还是其他的文件,在内存中都是以比特位来进行存储的,MD5算法就是不管你要计算的比特位有多少为,它会以512位来分组,一组接着一组按照特定的算法计算下来。最终结果总能得到128bit的特有的比特位。这128位特有的比特位可以唯一的标识这个字符串或者文件。这是我自己的理解,可能不是非常的对,但是对于用它理解MD5算法,并在此基础上运用java的MessageDigest()函数有很大的帮助。

          接下来,要了解的是,我们用MessageDigest()怎么来做才能获取字符串的MD5编码。

          接下来的做法是,

              1.用MessageDigest类方法计算出字符串的128bit特定的MD5编码。这是以比特位的形式存在的,按照java,这是以byte类型存在的。

            2.把这128bit转换成常见的32个表示16进制的数字或者是字母的字符形式,用来组成字符串的MD5编码,例如62ACCAF23AC9A73C0B28765B7DFAF75A这样子。

            3.怎么样把128bit转换成32个字符呢?其实MessageDigest的类方法返回的这128bit是一个byte[ ],一个byte有8个bit。128\div 8= 16也就是说,MessageDigest的类方法返回了一个byte[16]的数组。其中任意byte[i]有8bit。现在要做的就是把byte[16]转换成一个含有32个字符的String串。也就是每一个byte[i]的8bit需要转换成两个表示16进制的字母或数字的字符。即每4bit转换成为一个字符。把一个byte[i]转化成两个字符的做法是通常是运用String数组来实现的。通过事先建立的表示16进制字符的数组, 比如,我们这里建立一个String数组String[ ] hexArray={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}。然后运用每个byte[i]的高4bit和低4bit作为指示String数组的下标,来分别获取两个16进制的字符。比如其中byte[1]=00101010,那么ouputString = hexArray[‘byte[i]的高四位’] + hexArray[‘byte[i]的低四位’]。即outputString = hexArray[2]+hexArray[10]。这样每个byte[i]便生成了两个表示16进制的字母或数字。

          接下来看一下java中MessageDigest类的应用过程

          java中MessageDigest类有下面几个方法:

          1.MessageDigest的类方法。返回MessageDigest实例。即类似  public MessageDigest getInstance( String method)这样。其中method是加密的算法,有MD5和SHA-1两种选择,我们这里选择MD5。

          2.MessageDigest的实例方法update( ),返回void。即类似 public void update( String rawString )这样。其中rawString为需要计算的MD5编码的字符串。调用这个方法,类似于给MessageDigest实例赋值。

          3.MessageDigest的实例方法digest( ),返回byte[ ]。即类似 public byte[ ] digest( )这样。调用这个方法MessageDigest实例开始计算MD5,并返回所生成的128bit的byte[16]数组。

          最后是实现的过程

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class ComputeMD5{
	public static String getMD5String(String rawString){    //用来计算MD5的函数
		String[] hexArray = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
		try{
			MessageDigest md = MessageDigest.getInstance("MD5");
			md.update(rawString.getBytes());
			byte[] rawBit = md.digest();
			String outputMD5 = " ";
			for(int i = 0; i<16; i++){
				outputMD5 = outputMD5+hexArray[rawBit[i]>>>4& 0x0f];
				outputMD5 = outputMD5+hexArray[rawBit[i]& 0x0f];
			}
			return outputMD5.trim();
		}catch(NoSuchAlgorithmException e){
			System.out.println("计算MD5值发生错误");
			e.printStackTrace();
		}
		return null;
	}
	
	public static void main(String[] args){    //举例使用
		System.out.println(getMD5String(args[0]));
	}
}

          用这个过程调用生成的MD5编码结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值