MessageDigest 經過其getInstance系列靜態函數來進行實例化和初始化。MessageDigest 對象經過使用 update
方法處理數據。任什麼時候候均可以調用 reset
方法重置摘要。一旦全部須要更新的數據都已經被更新了,應該調用 digest
方法之一完成哈希計算並返回結果。html
對於給定數量的更新數據,digest
方法只能被調用一次。digest
方法被調用後,MessageDigest 對象被從新設置成其初始狀態。java
MessageDigest 的實現可隨意選擇是否實現 Cloneable 接口。客戶端應用程能夠經過嘗試複製和捕獲 CloneNotSupportedException 測試可複製性:算法
MessageDigest md = MessageDigest.getInstance("SHA");編程
try {數組
md.update(toChapter1);安全
MessageDigest tc1 = md.clone();數據結構
byte[] toChapter1Digest = tc1.digest();app
md.update(toChapter2);ide
...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(String algorithm) 建立具備指定算法名稱的MessageDigest 實例對象。 |
方法摘要 | |
---|---|
Object |
clone() 若是實現是可複製的,則返回一個副本。 |
byte[] |
digest() 經過執行諸如填充之類的最終操做完成哈希計算。 |
byte[] |
digest(byte[] input) 使用指定的字節數組對摘要進行最後更新,而後完成摘要計算。 |
int |
digest(byte[] buf, int offset, int len) 經過執行諸如填充之類的最終操做完成哈希計算。 |
String |
getAlgorithm() 返回標識算法的獨立於實現細節的字符串。 |
int |
getDigestLength() 返回以字節爲單位的摘要長度,若是提供程序不支持此操做而且實現是不可複製的,則返回 0。 |
static MessageDigest |
getInstance(String algorithm) 生成實現指定摘要算法的 MessageDigest 對象。 |
static MessageDigest |
getInstance(String algorithm, Provider provider) 生成實現指定提供程序提供的指定算法的 MessageDigest 對象,若是該算法可從指定的提供程序獲得的話。 |
static MessageDigest |
getInstance(String algorithm, String provider) 生成實現指定提供程序提供的指定算法的 MessageDigest 對象,若是該算法可從指定的提供程序獲得的話。 |
Provider |
getProvider() 返回此信息摘要對象的提供程序。 |
static boolean |
isEqual(byte[] digesta, byte[] digestb) 比較兩個摘要的相等性。 |
void |
reset() 重置摘要以供再次使用。 |
String |
toString() 返回此信息摘要對象的字符串表示形式。 |
void |
update(byte input) 使用指定的字節更新摘要。 |
void |
update(byte[] input) 使用指定的字節數組更新摘要。 |
void |
update(byte[] input, int offset, int len) 使用指定的字節數組,從指定的偏移量開始更新摘要。 |
void |
update(ByteBuffer input) 使用指定的 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