如何在不捕获NoSuchAlgorithmException的情况下使用Java MD5 MessageDigest?

时间:2014-04-03 01:52:41

标签: java exception-handling message-digest

在Java中,如果我想计算MD5总和,我需要知道可能的异常:

try {
   MessageDigest md = MessageDigest.getInstance("MD5");
   // Do stuff
} catch (NoSuchAlgorithmException e) {
   // Can't happen...
}

但是,根据JVM规范,必须支持MD5,因此永远不应抛出异常。是否有不同的访问模式允许我编写更优雅的代码?

2 个答案:

答案 0 :(得分:3)

您可能会忘记Java实现并使用Guava的:http://docs.guava-libraries.googlecode.com/git-history/v11.0/javadoc/com/google/common/hash/Hashing.html#md5()。在Java中,您无法完全忽略Checked Exception。你要么抓住它,要么用#34;装饰异常"来装饰你的方法,或者得到一个不那么迂腐的图书馆。对我来说,下面的番石榴变种可以用最少量的仪式客户惊喜完成工作。

// Its my problem, yuk...
public byte[] md5TheHardWay( String s ) {
    try {
        MessageDigest md = MessageDigest.getInstance( "MD5" );
        // Do stuff
        byte[] result = md.digest( s.getBytes() );
        return result;
    } catch ( NoSuchAlgorithmException e ) {
        // Can't happen...
        e.printStackTrace();
    }
    return null;
}

// Its your problem, yuk...
public byte[] md5ItsYourProblemClient( String s ) throws NoSuchAlgorithmException {
    MessageDigest md = MessageDigest.getInstance( "MD5" );
    // Do stuff
    byte[] result = md.digest( s.getBytes() );
    return result;
}

// Its no problem...I like Guava.
public byte[] md5ThroughGuava( String s ) {
    HashFunction md = Hashing.md5();
    HashCode code = md.hashBytes( s.getBytes() );
    return code.asBytes();
}

浏览Guava代码,他们如何做到这一点很有意思。出于所有意图和目的,番石榴图书馆的作家去了#34;它是我的问题,你..." path,捕获已检查的异常,并将其转换为RuntimeException。聪明有效。

// an excerpt from the Guava sourcecode
private static MessageDigest getMessageDigest(String algorithmName) {
  try {
    return MessageDigest.getInstance(algorithmName);
  } catch (NoSuchAlgorithmException e) {
    throw new AssertionError(e);
  }
}

我提到过我喜欢番石榴吗?我喜欢番石榴。

答案 1 :(得分:2)

而不是MessageDigest您可以使用common.apache  DigestUtils。 这很容易使用,无需采用如此长的程序来消化MessageDigest之类的数据。

DigestUtils.md5("String to digest");

浏览this课程并按照documentation

进行操作