本文博客原文
MessageDigest通过其getInstance系列静态函数来进行实例化和初始化。MessageDigest 对象通过使用update
方法处理数据。任何时候都可以调用reset
方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用digest
方法之一完成哈希计算并返回结果。
对于给定数量的更新数据,digest
方法只能被调用一次。digest
方法被调用后,MessageDigest对象被重新设置成其初始状态。
MessageDigest的实现可随意选择是否实现 Cloneable 接口。客户端应用程可以通过尝试复制和捕获 CloneNotSupportedException 测试可复制性:
MessageDigest md = MessageDigest.getInstance("SHA");
try {
md.update(toChapter1);
MessageDigest tc1 = md.clone();
byte[] toChapter1Digest = tc1.digest();
md.update(toChapter2);
...etc.
} catch (CloneNotSupportedException cnse) {
throw new DigestException("couldn't make digest of partial content");
}
注意1:即时给定MessageDigest的实现是不可复制的,则仍然能够通过getInstance方法实例化几个实例计算来同时进行摘要信息的计算。
注意2:由于历史原因,此类是抽象的,是从MessageDigestSpi
扩展的。应用程序开发人员只应该注意在此MessageDigest
类中定义的方法;超类中的所有方法是供希望提供自己的信息摘要算法实现的加密服务提供者使用的。
注意3:MessageDigest并不是单实例的。如下代码所示:
try
{
MessageDigest mdTemp1 = MessageDigest.getInstance("MD5");
MessageDigest mdTemp2= MessageDigest.getInstance("MD5");
MessageDigest mdTemp3= MessageDigest.getInstance("MD5");
System.out.println("mdTemp1==mdTemp2?:"+(mdTemp1==mdTemp2));
System.out.println("mdTemp2==mdTemp3?:"+(mdTemp2==mdTemp3));
} catch (NoSuchAlgorithmException e)
{
// 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 更新摘要。 |
public static MessageDigest getInstance(String algorithm)
public static MessageDigest getInstance(String algorithm, String provider);
public void update(byte[] input)
MessageDigest m=MessageDigest.getInstance("MD5");
m.update(x.getBytes("UTF8" ));
byte s[ ]=m.digest( );
900150983cd24fb0d6963f7d28e17f72