对象压缩后MD5哈希不匹配

时间:2012-04-21 11:20:32

标签: object md5 compression mismatch

我正在使用以下代码片段压缩Serializable对象:

 private byte[] compressObject(Object obj) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    GZIPOutputStream gzipOut = new GZIPOutputStream(baos);
    ObjectOutputStream objectOut = new ObjectOutputStream(gzipOut);
    objectOut.writeObject(obj);     
    objectOut.close();
    byte[] bytes = baos.toByteArray();

    return bytes;       
}

使用以下代码段解压缩同一个对象:

private Object decompressObject(byte[] bytes) throws IOException,ClassNotFoundException {
    ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
    GZIPInputStream gzipIn = new GZIPInputStream(bais);
    ObjectInputStream objectIn = new ObjectInputStream(gzipIn);
    Object obj = objectIn.readObject();     
    objectIn.close();

    return obj;
}

在压缩Object之前和解压缩Object之后,我使用以下代码片段计算MD5 Hash:

public String getMD5Hash(Object obj) throws IOException, NoSuchAlgorithmException {

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutput out = new ObjectOutputStream(bos);   
    out.writeObject(obj);
    byte[] data = bos.toByteArray();                
    MessageDigest m = MessageDigest.getInstance("MD5");                     
    m.update(data,0,data.length);
    BigInteger i = new BigInteger(1,m.digest());
    return String.format("%1$032X", i);     
}

但是在压缩之前和压缩之后计算的MD5哈希值不匹配。请建议如何在解压缩后获取对象。

感谢。

1 个答案:

答案 0 :(得分:0)

您可能需要在GZIPOutputStream上使用finish方法来使其压缩数据。