本文博客原文
參考文章:http://blog.sina.com.cn/s/blog_4f36423201000c1e.htmlMessageDigest通过其getInstance系列静态函数来进行实例化和初始化。MessageDigest 对象通过使用update
方法处理数据。不论什么时候都能够调用reset
方法重置摘要。一旦全部须要更新的数据都已经被更新了,应该调用digest
方法之中的一个完毕哈希计算并返回结果。
对于给定数量的更新数据,digest
方法仅仅能被调用一次。digest
方法被调用后,MessageDigest对象被又一次设置成其初始状态。
MessageDigest的实现可任意选择是否实现 Cloneable 接口。client应用程能够通过尝试复制和捕获 CloneNotSupportedException 測试可复制性:
MessageDigestmd =MessageDigest.getInstance("SHA");
try{
md.update(toChapter1);
MessageDigesttc1 =md.clone();
byte[]toChapter1Digest =tc1.digest();
md.update(toChapter2);
...etc.
}catch(CloneNotSupportedExceptioncnse){
thrownewDigestException("couldn't make digest of partial content");
}
注意1:即时给定MessageDigest的实现是不可复制的,则仍然可以通过getInstance方法实例化几个实例计算来同一时候进行摘要信息的计算。
注意2:因为历史原因,此类是抽象的,是从MessageDigestSpi
扩展的。应用程序开发者仅仅应该注意在此MessageDigest
类中定义的方法;超类中的全部方法是供希望提供自己的信息摘要算法实现的加密服务提供者使用的。
注意3:MessageDigest并非单实例的。例如以下代码所看到的:
try
{
MessageDigestmdTemp1 =MessageDigest.getInstance("MD5");
MessageDigestmdTemp2=MessageDigest.getInstance("MD5");
MessageDigestmdTemp3=MessageDigest.getInstance("MD5");
System.out.println("mdTemp1==mdTemp2?:"+(mdTemp1==mdTemp2));
System.out.println("mdTemp2==mdTemp3?:"+(mdTemp2==mdTemp3));
}catch(NoSuchAlgorithmExceptione)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
执行结果
mdTemp1==mdTemp2?:false
mdTemp2==mdTemp3?:false
构造方法摘要 | |
---|---|
protected | MessageDigest(Stringalgorithm) 创建具有指定算法名称的MessageDigest实例对象。 |
方法摘要 | |
---|---|
Object | clone() 假设实现是可复制的,则返回一个副本。 |
byte[] | digest() 通过运行诸如填充之类的终于操作完毕哈希计算。 |
byte[] | digest(byte[]input) 使用指定的字节数组对摘要进行最后更新,然后完毕摘要计算。 |
int | digest(byte[]buf, intoffset, intlen) 通过运行诸如填充之类的终于操作完毕哈希计算。 |
String | getAlgorithm() 返回标识算法的独立于实现细节的字符串。 |
int | getDigestLength() 返回以字节为单位的摘要长度,假设提供程序不支持此操作而且实现是不可复制的,则返回 0。 |
staticMessageDigest | getInstance(Stringalgorithm) 生成实现指定摘要算法的 MessageDigest 对象。 |
staticMessageDigest | getInstance(Stringalgorithm,Providerprovider) 生成实现指定提供程序提供的指定算法的 MessageDigest 对象,假设该算法可从指定的提供程序得到的话。 |
staticMessageDigest | getInstance(Stringalgorithm,Stringprovider) 生成实现指定提供程序提供的指定算法的 MessageDigest 对象,假设该算法可从指定的提供程序得到的话。 |
Provider | getProvider() 返回此信息摘要对象的提供程序。 |
staticboolean | isEqual(byte[]digesta, byte[]digestb) 比較两个摘要的相等性。 |
void | reset() 重置摘要以供再次使用。 |
String | toString() 返回此信息摘要对象的字符串表示形式。 |
void | update(byteinput) 使用指定的字节更新摘要。 |
void | update(byte[]input) 使用指定的字节数组更新摘要。 |
void | update(byte[]input, intoffset, intlen) 使用指定的字节数组,从指定的偏移量開始更新摘要。 |
void | update(ByteBufferinput) 使用指定的 ByteBuffer 更新摘要。 |
publicstaticMessageDigestgetInstance(Stringalgorithm)
MessageDigest.getInstance("SHA");MessageDigest.getInstance("sha");MessageDigest.getInstance("sHa");
publicstaticMessageDigestgetInstance(Stringalgorithm,Stringprovider);
publicvoidupdate(byteinput);publicvoidupdate(byte[]input);publicvoidupdate(byte[]input,intoffset,intlen);
publicbyte[]digest();publicbyte[]digest(byte[]input);publicintdigest(byte[]buf,intoffset,intlen);
publicvoidupdate(byte[]input)
MessageDigestm=MessageDigest.getInstance("MD5");
m.update(x.getBytes("UTF8"));
bytes[]=m.digest();
staticStringconvertToHexString(bytedata[]){StringBufferstrBuffer =newStringBuffer();for(inti =0;i <data.length;i++){strBuffer.append(Integer.toHexString(0xff&data[i]));}returnstrBuffer.toString();}
publicclassMessageDigestDemoextendsThread{publicvoidrun(){Stringtext ="abc";bytedata[]=null;MessageDigestm;try{data =text.getBytes("UTF8");m =MessageDigest.getInstance("MD5");m.update(data);byteresultData[]=m.digest();System.out.println(convertToHexString(resultData));}catch(NoSuchAlgorithmExceptione){// TODO Auto-generated catch blocke.printStackTrace();} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}staticStringconvertToHexString(bytedata[]){StringBufferstrBuffer =newStringBuffer();for(inti =0;i <data.length;i++){strBuffer.append(Integer.toHexString(0xff&data[i]));}returnstrBuffer.toString();}}
900150983cd24fb0d6963f7d28e17f72
publicStringmd5sumWithEncoder(Stringtext)throwsNoSuchAlgorithmException,UnsupportedEncodingException{/*确定计算方法*/MessageDigestmd5=MessageDigest.getInstance("MD5");BASE64Encoder base64en =newBASE64Encoder();/*加密后的散列码字符串*/StringstrMd5=base64en.encode(md5.digest(text.getBytes("utf-8")));returnstrMd5;}
Stringstr="0123456789"System.out.println(md5sumWithEncoder(str));