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