我有 2 个名称不同但内容相同的文件。当我创建这些文件的流并使用该FileInputStream.HashCode();
方法查找哈希值时,我收到不同的值
如果可能的话,有人可以为我提供正确的 API,以便 Java 中的哈希方法接收相同内容的文件的相同哈希值。
听起来加密哈希函数可以满足您的需求。
Apache Commons Codec库有一个用于创建加密哈希值(又名消息摘要)的实用程序类,称为DigestUtils。例如,该sha256
方法接受InputStream
并返回一个 SHA-256 消息摘要作为字节数组。
FileInputStream 没有名为 hashCode() 的方法。它使用通用的Object.hasCode()方法。
返回对象的哈希码值。支持这种方法是为了有利于哈希表,例如 HashMap 提供的那些。
hashCode 的一般合约是:
- 每当在 Java 应用程序执行期间对同一个对象多次调用它时,hashCode 方法必须始终返回相同的整数,前提是没有修改对象上的 equals 比较中使用的信息。该整数不需要从应用程序的一次执行到同一应用程序的另一次执行保持一致。
- 如果两个对象根据 equals(Object) 方法相等,则对两个对象中的每一个调用 hashCode 方法必须产生相同的整数结果。
- 如果根据 equals(java.lang.Object) 方法,如果两个对象不相等,则不需要对两个对象中的每一个调用 hashCode 方法都必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。
在合理可行的情况下,由 Object 类定义的 hashCode 方法确实为不同的对象返回不同的整数。(这通常通过将对象的内部地址转换为整数来实现,但 JavaTM 编程语言不需要这种实现技术。)
FileInputStream.HashCode()
继承内部地址hashCode
。Object
它不考虑内容。
此外,如果您想比较 2 个文件是否相等,为什么要使用哈希函数?
由于冲突,两个不同的字符串可能具有相同的哈希码。与文件的内容相同。
如果可以FileUtils.contentEquals(file1, file2);
使用第三方库(Commons IO),则可以使用