java根据哈希确认文件内容
我需要“检查文件内容的完整性”。这些文件将写入CD/DVD,可能会被复制多次。这样做的目的是识别正确复制的副本(从Nero等处移除后)
我对这一点相当陌生,但快速搜索表明^{File
的byte[]
进行比较
我是否正确理解了该方法,这是检查文件内容的有效方法吗
如果没有,建议搜索关键字或策略/方法/类将不胜感激
工作代码基于Brendan的答案。它处理由VoidStar识别的问题(需要将整个byte[]
保存在内存中以获取散列)
import java.io.File;
import java.io.FileInputStream;
import java.util.zip.CRC32;
class TestHash {
public static void main(String[] args) throws Exception {
File f = new File("TestHash.java");
FileInputStream fis = new FileInputStream(f);
CRC32 crcMaker = new CRC32();
byte[] buffer = new byte[65536];
int bytesRead;
while((bytesRead = fis.read(buffer)) != -1) {
crcMaker.update(buffer, 0, bytesRead);
}
long crc = crcMaker.getValue(); // This is your error checking code
System.out.println("CRC code is " + crc);
}
}
# 1 楼答案
是的,只要加载整个文件并传入,它就会按预期执行但是它将消耗与文件大一样多的RAM,这对于此任务来说是不必要的。如果在从存储中传输文件时将其散列在较小的块中,则可以避免浪费内存。例如,您可以对每个块的散列进行异或运算,以创建最终的散列,或者找到期望数据流化的散列实现
# 2 楼答案
Arrays.hashCode()
被设计为非常快(用于哈希表)。我强烈建议不要为此目的使用它您需要的是某种类型的错误检查代码,如CRC
Java恰好有一个类用于计算这些:CRC32:
# 3 楼答案
以下是一个例子:
您需要创建一个校验和文件
http://www.jguru.com/faq/view.jsp?EID=216274