我有一个文件,我需要为其计算SHA512值。我发现有很多网站可以为我做这件事,但是我想用Java以编程方式来做(嗯,Groovy,但是是同一回事)。
[出于好奇,我正在运行Oracle的TZUpdater工具,并将其指向本地文件。这需要一个包含该文件的SHA512值的文件。http://www.oracle.com/technetwork/java/javase/tzupdater-readme-136440.html
如果第三方库是公平的游戏,那么番石榴的Files.hash
可以使这个变得简单
Files.hash
...这也可能更有效率;如果文件很大,则不需要像Files.hash(new File(fileName), Hashing.sha512()).toString();
解决方案一样一次将其存储在内存中。这还将以十六进制输出适当的哈希值;如果需要以字节为单位,则只需使用Files.readAllBytes
而不是asBytes()
。
您可以使用此代码段来计算文件的SHA-512摘要:
toString()
要使此代码正常工作,您将需要JDK7或更高版本。
注意:如果文件太大而不能容纳在内存中,则建议按照建议使用Guava。
最简单的解决方案,没有外部库,大文件没有问题:
MessageDigest.getInstance("SHA-512").digest(Files.readAllBytes(Paths.get("/path/file.txt")))
源代码:public static String hashFile(File file)
throws NoSuchAlgorithmException, FileNotFoundException, IOException {
// Set your algorithm
// "MD2","MD5","SHA","SHA-1","SHA-256","SHA-384","SHA-512"
MessageDigest md = MessageDigest.getInstance("SHA-512");
FileInputStream fis = new FileInputStream(file);
byte[] dataBytes = new byte[1024];
int nread = 0;
while ((nread = fis.read(dataBytes)) != -1) {
md.update(dataBytes, 0, nread);
}
byte[] mdbytes = md.digest();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < mdbytes.length; i++) {
sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
}