2012-09-09 47 views
0

我需要計算字符串的MD5散列並使用Google搜索this散列字符串和相關異常

我想有一個可重用的工具類負責哈希一個字符串,我會像這樣使用:AeSimpleMD5.MD5(myString);

這個調用意味着我必須檢查NoSuchAlgorithmExceptionUnsupportedEncodingException每次我想散列一個字符串;我有幾個關於這個問題,我會複製可能會拋出的行:

MessageDigest md = MessageDigest.getInstance("MD5"); 
    md.update(str.getBytes("iso-8859-1"), 0, str.length()); 

1)是否會拋出異常? MD5 algotithm或「iso-8859-1」編碼怎麼可能丟失?

2)我想知道如果碰巧遇到這些例外之一,我該怎麼辦;答案是:可能什麼都沒有!因此將異常封裝到新的運行時異常(可能類似於MD5HashingException)是沒有意義的?

+0

只是順便:MD5已經被有效打破。除非您必須使用MD5與另一個應用程序進行交互,否則您應該考慮使用更安全的哈希算法,如SHA-256。 – Philipp

+0

沒有任何實際用途。 – bmargulies

回答

2

這裏的典型模式是:

try { 
    /* do whatever */ 
} catch (ExceptionIDontBelieveIn eidbi) [ 
    throw new RuntimeException(eidbi); // or subclass thereof 
} 

這就是你如何表達:「在我的情況,我相信,此異常不會發生。」如果您確定代碼永遠不會在缺少MD5或ISO-8859-1的某些異國開機類路徑中運行,那麼這就是解決方案。

1
  1. 大多數情況下可能不是,似乎不太可能將MD5從未來的實施中刪除。
  2. 我認爲你有正確的想法。對此沒有任何關係,因此引用它並拋出自定義的RuntimeException似乎是最明智的做法。儘管如此,你不必這樣做。在初始化過程中只需要參考MessageDigest,稍後再保存和重用。
+0

我打算嘗試/捕捉方法MD5()內的那些行,是不是相同(實際上講)? – tmh

+0

@tmh:是的,在實踐中這是一樣的。 – Keppil

0

由於

MessageDigest.getInstance(); 

採取String作爲參數的原始設計,有檢查進行檢查,如果存在散列algorithim因此可能性NoSuchAlgorithmException再也編譯時被拋出。

但是,由於MD5是Java支持的標準算法,因此不應拋出此異常。

iso-8859-1字符編碼也是如此。

+0

我知道這一點,顯然這些例外*使*有意義。但是,如果他們唯一的目標是表示*可能性*,我認爲他們應該沒有被選中:就像'Integer.parseInt(aString)'可能會拋出'NumberFormatException'(這是沒有被選中的,正好)。 – tmh

0

您可以考慮使用谷歌番石榴,你不必應付在這種情況下例外(因爲他們不能happend):

byte[] hashedBytes = Hashing.md5().hashString(str, Charsets.ISO_8859_1).asBytes();