哈希函数用于具有不同名称和相同内容的文件

时间:2013-04-07 20:53:42

标签: java hash

我有两个名称不同但内容相同的文件。当我创建这些文件的流并使用FileInputStream.HashCode();方法查找哈希值时,我会收到不同的值

如果可能的话,有人可以为我提供正确的API,以便Java中的哈希方法为具有相同内容的文件接收相同的哈希值。

3 个答案:

答案 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);