2012-09-09 50 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();