散列文件以识别它们的替代方法?

Alternative for hashing Files to recognize them?

我正在寻找一种根据文件内容识别文件的方法。所以我需要一个独立于文件位置、名称、属性等的方法。

通常我会使用像 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

根据您处理的文件类型,仅使用文件的一部分进行哈希处理可能就足够了。例如。如果这是压缩图像数据,那么如果您只对前几千字节(可能还有最后几千字节)进行哈希处理,您将获得文件的唯一不同哈希值的可能性非常高。 这可能不适用于始终以相同方式开始的未压缩数据库转储。

作为第一个提前通过,您可以简单地比较文件大小。

对文件进行哈希处理后,您可以将哈希与文件的 ctime 一起存储。只要 ctime 没有改变,就不需要重新散列。 (您可以改用 mtime,但您需要依赖修改文件的程序,而不是手动将 mtime 设置为原来的样子。)