我正在搜索根据内容识别文件的方法。所以我需要一个独立于文件位置,名称,属性等的方法。
通常我会使用像SHA-1或MD5这样的哈希函数。问题是我想要识别的文件的大小。这些文件通常在5到15 GB之间。
我使用SHA-1哈希的方法不是一个好的解决方案。散列这么大的文件需要几分钟......我需要更快的东西,这样就可以在几秒钟内识别出之前扫描过的文件。
对于这样的需求,是否有另一种方法而不是哈希文件?
我当前的Java代码与我的Mac上的openssl sha1 <path>
相当:
MessageDigest md = MessageDigest.getInstance("SHA1");
FileInputStream fis = new FileInputStream(f.getPath());
byte[] dataBytes = new byte[1024];
int nread = 0;
while ((nread = fis.read(dataBytes)) != -1) {
md.update(dataBytes, 0, nread);
};
fis.close();
byte[] mdbytes = md.digest();
//convert the byte to hex format
StringBuffer sb = new StringBuffer("");
for (int i = 0; i < mdbytes.length; i++) {
sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
但实际上我正在寻找除了这种哈希算法之外的其他东西。你有什么想法吗? : - )
BR m4xy
答案 0 :(得分:2)
根据您处理的文件类型,仅使用文件的部分内容就足够了。例如。如果这是压缩的图像数据,则可能非常高,如果您只散列前几千字节(可能是最后几千字节),您将获得文件的唯一不同哈希值。 这可能不适用于始终相同的未压缩数据库转储。
答案 1 :(得分:0)
作为第一个早期传递,你可以简单地比较文件大小。
一旦您对文件进行了哈希处理,您就可以使用文件的ctime存储哈希值。只要ctime没有改变,就没有必要重新进行更新。 (你可以使用mtime代替,但你需要依赖修改文件的程序,而不是手动将mtime设置为它。)