【发布时间】:2015-02-23 16:42:51
【问题描述】:
我可以在一组 jar/war 文件上连续运行 5 次相同的 maven 构建,而无需对其中任何一个文件进行任何更改,但每次我在每个 jar/war 文件上都得到不同的 MD5 哈希.我希望java编译器每次都产生相同的哈希。是否有任何文件会影响我可以排除的哈希值,以便每次都给我相同的哈希值?还是只是编译器不会每次都以相同的方式编译相同的代码?
正在使用以下代码生成哈希:
public static String getHash(File file) throws FileNotFoundException, IOException {
if(file == null || !file.isFile()) {
return "";
}
FileInputStream in = null;
try {
in = new FileInputStream(file);
byte [] bytes = toByteArray(in);
return getHash(bytes);
} catch(Exception e) {
Logging.log("Unable to get MD5 hash for file: " + ile.getName());
} finally {
StreamUtils.close(in);
}
return "";
}
public static String getHash(byte[] bytes) {
MessageDigest digest = getMessageDigest();
byte[] hash = digest.digest(bytes);
StringBuilder builder = new StringBuilder();
for (int val : hash) {
builder.append(Integer.toHexString(val & 0xff));
}
return builder.toString();
}
private static MessageDigest getMessageDigest() {
try {
return MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
【问题讨论】:
-
你是如何生成哈希的?
-
例如,您的包中可能包含一些包含构建时间的 META 文件。
-
更新为包含哈希计算
-
@xor_eq 我查看了其中一个 jar 文件,并且清单不包含构建版本、日期或任何在构建之间会发生变化的内容。
-
ile.getName()在您的catch块中是否只是问题拼写错误?