如何为 Java 对象生成校验和

2022-09-02 05:15:01

我正在寻找一种解决方案来为任何类型的Java对象生成校验和,对于生成相同对象的应用程序的每次执行,校验和都保持不变。

我用Object.hashCode()尝试了它,但api说

....此整数不必从应用程序的一次执行到同一应用程序的另一次执行保持一致。


答案 1
public static String getChecksum(Serializable object) throws IOException, NoSuchAlgorithmException {
    ByteArrayOutputStream baos = null;
    ObjectOutputStream oos = null;
    try {
        baos = new ByteArrayOutputStream();
        oos = new ObjectOutputStream(baos);
        oos.writeObject(object);
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] thedigest = md.digest(baos.toByteArray());
        return DatatypeConverter.printHexBinary(thedigest);
    } finally {
        oos.close();
        baos.close();
    }
}

答案 2

我遇到了类似的问题(为XML文件生成良好的哈希码),我发现最好的解决方案是通过MessageDigest使用MD5,或者如果你需要更快的东西:Fast MD5。请注意,即使每次都是一样的,它还是太短(只有32位),以确保高唯一性。我认为64位是计算良好哈希代码的最小值。请注意,MD5会生成128位长的哈希代码,在这种情况下应该更需要。Object.hashCode

当然,要使用,您需要首先序列化(在您的情况下是 marshall)对象。MessageDigest