用于识别文件的哈希算法的替代方案?

3
我正在寻找一种根据文件内容识别文件的方法。因此,我需要一种独立于文件位置、名称、属性等的方法。
通常,我会使用像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();

但实际上我正在寻求除此之外的其他哈希算法。你有什么想法吗?:-)

敬礼 m4xy

2个回答

2

根据您处理的文件类型不同,只使用部分文件进行哈希可能就可以了。例如,如果这是压缩图像数据,那么如果您只对前几千字节(也许是最后几千字节)进行哈希,很有可能会得到唯一的不同哈希值。但对于始终相同的未压缩数据库转储,这种方法可能行不通。


我喜欢将文件的小部分哈希作为“足够好”的解决方案的想法。我会把它存起来以备将来使用。 - ihaztehcodez

0
作为第一个早期退出的步骤,您可以简单地比较文件大小。
一旦您对文件进行了哈希处理,就可以将哈希值与文件的创建时间一起存储。只要创建时间没有更改,就无需重新哈希处理。(您也可以使用修改时间,但需要依赖于修改文件的程序不手动设置修改时间。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接