»

Apr 03

Java MD5 Hash

How do you get a MD5 hash in Java? Well I am glad you asked! I have somehow managed to create some Java code that does exactly that. Here it is for your cut and pasting pleasure! I have seen some code out there that won’t work correctly if the hashed value starts with zeros (generally because they are using a BigInteger). This version will properly display leading zeroes.

public class Hasher {
    /**
     * Gets the md5 hash of the passed in bytes
     *
     * @param bytes The bytes to determine the md5 hash of
     * @return a String containing the md5 hash string
     */
    public String getMd5Hash(byte[] bytes) {
        Formatter fm = new Formatter();
        MessageDigest digest = null;
        try {
            digest = MessageDigest.getInstance("MD5");
            digest.update(bytes);
            bytes = digest.digest();
            for (byte b : bytes) {
                fm.format("%02x", b);
            }
        } catch (NoSuchAlgorithmException e) {
            System.out.println("Exception: " + e);
        }

        return fm.out().toString();
    }

    public static void main(String[] args) {
        Hasher hasher = new Hasher();
        String hash = hasher.getMd5Hash("what is the md5 hash of this?".getBytes());
        System.out.println("hash = " + hash);
    }
}

If you run this code the output will be:

hash = 49a9884c3121800a49d64a5389691d1a

Comparing this to obtaining the md5 hash from the command-line shows that I actually managed to put together some code that works. This is on Mac OS, although every unix flavor probably has a md5 command-line utility:

bad:~:7> md5 -s "what is the md5 hash of this?"
MD5 ("what is the md5 hash of this?") = 49a9884c3121800a49d64a5389691d1a

This code actually demonstrates another issue I sometimes have with Java. That being that the JDK itself doesn’t always get the checked vs. unchecked exception nonsense correct. Being a bad programmer might mean that I don’t have a clue what I am talking about, but NoSuchAlgorithmException should not be a checked exception! I can’t reasonably be expected to recover from that exception so it should be unchecked. If a unknown algorithm is being passed to getInstance() then that is a programming error, so again, that should be an unchecked exception.

There are currently no comments highlighted.

2 comments

  1. dimer0

    Grab commons-codec, and your code gets a bit simpler:

    http://commons.apache.org/codec/api-release/org/apache/commons/codec/digest/DigestUtils.html#md5Hex(java.lang.String)

    1. BadProgrammer

      Using commons-codec would mean adding a 3rd party dependency to your project for something that is really easy to do on your own. If you are already using commons-codec for something else then you should probably just use the md5 method available there. Otherwise just roll your own.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>