我需要计算字符串的MD5哈希并使用Google搜索找到this。
我希望有一个可重用的实用程序类负责散列字符串,我会这样使用:AeSimpleMD5.MD5(myString);
。
这个调用暗示我每次想要散列字符串时都要检查NoSuchAlgorithmException
和UnsupportedEncodingException
;我对此有几个疑问,我将复制可能抛出异常的行:
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(str.getBytes("iso-8859-1"), 0, str.length());
1)是否会抛出异常?怎么可能缺少MD5 algotithm或“iso-8859-1”编码?
2)我想知道如果我碰巧遇到其中一个例外,我该怎么办?答案是:可能什么都没有!因此将异常包装到新的运行时异常(可能类似MD5HashingException
)中会更有意义吗?
答案 0 :(得分:2)
这里的典型模式是:
try {
/* do whatever */
} catch (ExceptionIDontBelieveIn eidbi) [
throw new RuntimeException(eidbi); // or subclass thereof
}
这就是你表达的方式:“在我的情况下,我相信这种例外不会发生”。如果您确定代码永远不会在缺少MD5或ISO-8859-1的异乎寻常的引导类路径中运行,那么这就是解决方案。
答案 1 :(得分:1)
MD5
似乎不太可能从未来的实现中删除。 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();