gpt4 book ai didi

java - 计算可序列化对象与字符串的 md5 时获得不同的结果

转载 作者:行者123 更新时间:2023-12-01 19:50:00 26 4
gpt4 key购买 nike

我想计算任何可序列化对象的 md5,这是通过以下函数完成的。

public static String getMd5Hash(Serializable object) {
try {
return getChecksum(object, "MD5");
} catch (Exception e) {
throw new RmsException("Exception while generating md5 hash", e);
}
}



public static String getMd5Hash(Serializable object) {
try {
return getChecksum(object, "MD5");
} catch (Exception e) {
throw new RuntimeException("Exception while generating md5 hash", e);
}
}

private static String getChecksum(Serializable object, String algorithm)
throws IOException, NoSuchAlgorithmException {
try (
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos)
) {
oos.writeObject(object);
MessageDigest md = MessageDigest.getInstance(algorithm);
byte[] theDigest = md.digest(baos.toByteArray());
return DatatypeConverter.printHexBinary(theDigest);
}
}

测试

@Test
public void getMd5Hash() {
String actual = CryptoUtils.getMd5Hash("water");

Assert.assertEquals("9460370bb0ca1c98a779b1bcc6861c2c", actual);
}

操作

Expected :9460370bb0ca1c98a779b1bcc6861c2c (actual md5 for string water)
Actual :37F7DBD142DABF05ACAA6759C4D9E96C (Why the diff?)

最佳答案

ObjectOutputStream 添加了一个 header ,因此当您获取字节数组时,您传递的 Serialized 实际上并不代表“水”。打印出 baos.toString() 进行验证。您可以扩展ObjectOutputStream并重写writeStreamHeader方法,或者使用数据的子字符串(即md)调用md.digest。摘要(baos.substring(7).getBytes()) (或类似的东西)。一旦消化的实际数据是“水”,哈希就会正确。

关于java - 计算可序列化对象与字符串的 md5 时获得不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51721596/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com