散列字符串和相关的异常

时间:2012-09-09 16:21:06

标签: java exception exception-handling md5

我需要计算字符串的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)中会更有意义吗?

4 个答案:

答案 0 :(得分:2)

这里的典型模式是:

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

这就是你表达的方式:“在我的情况下,我相信这种例外不会发生”。如果您确定代码永远不会在缺少MD5或ISO-8859-1的异乎寻常的引导类路径中运行,那么这就是解决方案。

答案 1 :(得分:1)

  1. 很可能不是,MD5似乎不太可能从未来的实现中删除。
  2. 我认为你有正确的想法。没有什么可以做的,所以使用它并抛出一个自定义的RuntimeException似乎是最明智的事情。但是,您不必多次执行此操作。只需在初始化期间获得对MessageDigest的引用,并在以后保存并重复使用。

答案 2 :(得分:0)

由于

的原始设计
MessageDigest.getInstance();

String作为参数,没有进行编译时检查以检查散列算法是否存在因此的可能性 NoSuchAlgorithmException可能被抛出。

但是,由于MD5是Java支持的标准算法,因此不应抛出此异常。

iso-8859-1字符编码也是如此。

答案 3 :(得分:0)

您可以考虑使用Google Guava,在这种情况下您不必处理例外情况(因为它们不会发生):

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