Конкретно это не понятно
for(byte e : mdbytes) {

            sb.append(String.format("%02x", e & 0xff));
            System.out.println(sb);
        }
Зачем переводить в шестнадцатиричную форму, если метод digest() возвращает в байтах хеш? Почему, допустим, не сравнить в тех же самых байтах тот ли объект захешировался или нет. Все прочел про MessageDigest, везде после хеширования переводят в 16-ное представление, но не объясняется зачем
public class Solution {
    public static void main(String... args) throws Exception {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(new String("test string"));
        oos.flush();
        System.out.println(compareMD5(bos, "5a47d12a2e3f9fecf2d9ba1fd98152eb")); //true

    }

    public static boolean compareMD5(ByteArrayOutputStream byteArrayOutputStream, String md5) throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] b = byteArrayOutputStream.toByteArray();
        md.update(b);
        byte[] mdbytes = md.digest();
        StringBuilder sb = new StringBuilder();
        for(byte e : mdbytes) {

            sb.append(String.format("%02x", e & 0xff));
            System.out.println(sb);
        }

        String digest = sb.toString();
        if (md5.equals(digest))
            return true;
        return false;
    }
}