0

我需要计算一个字符串的 MD5 哈希并在谷歌上搜索我发现了这个

我想要一个负责散列字符串的可重用实用程序类,我会像这样使用它AeSimpleMD5.MD5(myString);

这个调用意味着我必须检查NoSuchAlgorithmException并且UnsupportedEncodingException每次我想散列一个字符串;我对此有几个问题,我将复制可能引发异常的行:

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

1)是否会抛出异常?怎么可能缺少 MD5 算法或“iso-8859-1”编码?

2)我想知道如果我碰巧遇到这些异常之一该怎么办;答案是:可能什么都没有!那么将异常包装到新的运行时异常(可能类似于MD5HashingException)中是否更有意义?

4

4 回答 4

2

这里的典型模式是:

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

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

于 2012-09-09T16:37:45.467 回答
1
  1. 很可能不会,似乎极不可能MD5从未来的实现中删除。
  2. 我认为你的想法是正确的。对此没有什么可做的,因此将其捕获并抛出自定义 RuntimeException 似乎是最明智的做法。不过,您不必多次这样做。只需MessageDigest在初始化期间获取对 的引用,然后保存并在以后重用它。
于 2012-09-09T16:23:25.923 回答
0

因为原来的设计

MessageDigest.getInstance();

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

但是,作为MD5Java 支持的标准算法,永远不应抛出此异常。

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

于 2012-09-09T16:33:02.567 回答
0

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

byte[] hashedBytes = Hashing.md5().hashString(str, Charsets.ISO_8859_1).asBytes();
于 2012-09-09T16:47:33.493 回答