本文博客原文
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
本文详细介绍了Java中MessageDigest类的使用方法,包括如何生成MD5和SHA散列码,提供了完整的代码示例,并解释了散列算法的基本概念。
916

被折叠的 条评论
为什么被折叠?



