2013-04-07 58 views
0

我有2个文件具有不同的名称但内容相同。当我创建这些文件的数据流,并使用FileInputStream.HashCode();方法找到的哈希值,我收到不同的值具有不同名称和相同内容的文件的散列函数

有人能给我提供与接收的文件相同的散列值正确的API如果可能的话在Java散列法相同的内容。

+0

我不认为这样的功能存在。要做到这一点,你必须阅读这两个文件的所有内容,这显然是一个昂贵的操作。 – 2013-04-07 20:54:54

+0

您确定FileInputStream.HashCode()的实现在两个输入流中保证相同的内容是相等的吗?请记住,这将需要输入流一直读到最后 - 这可能是不切实际的。 – Patashu 2013-04-07 20:55:16

+0

除非文件名是哈希算法的一部分,否则为什么读到底? – Floris 2013-04-07 20:58:45

回答

1

这听起来像一个Cryptographic Hash Function将满足您的需求。

Apache Commons Codec库具有用于创建称为DigestUtils的加密散列值(又名,消息摘要)的实用程序类。例如,sha256方法采用InputStream并以字节数组形式返回SHA-256消息摘要。

+0

是的,就是这样!非常感谢。 – 2013-04-07 22:45:25

0

FileInputStream没有名为hashCode()的方法。它使用通用的Object.hasCode()方法。

返回该对象的哈希码值。这种方法支持散列表的好处,如HashMap提供的那些。

hashCode的一般合同是:

  • 每当它是一个Java应用程序的执行期间,在同一对象不止一次上调用,hashCode方法必须始终 返回相同的整数,没有提供信息用于等于 对对象进行比较修改。该整数不必保持 从应用程序的一次执行到同一应用程序的另一次执行 的一致。
  • 如果两个对象根据equals(Object)方法相等,则对这两个对象中的每一个调用hashCode方法必须产生相同的整数结果 。
  • 不要求,如果两个对象根据equals不相等(java.lang.Object)方法,然后调用hashCode方法 上所述两个对象都必须产生不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同的 整数结果可能会提高散列表的性能。

多达是合理可行,通过 类对象定义的hashCode方法并针对不同的对象返回不同的整数。 (此 通常通过转换所述 对象的内部地址转换成一个整数来实现的,但是这种实现的技术是不被的JavaTM编程语言不需要 。)

+0

是的,你是对的,但我认为我们相互理解,谢谢! – 2013-04-07 20:59:44

0

FileInputStream.HashCode()继承ObjecthashCode这是内部地址。它不考虑内容。
此外,如果你想比较2个文件的平等,你为什么要使用散列函数?
由于碰撞,2个不同的字符串可能具有相同的哈希码。与文件的内容相同。

您可以使用FileUtils.contentEquals(file1, file2);如果你可以使用一个第三方库(下议院IO)

+0

这是我的任务使用散列函数,问题是,我检查过的所有算法返回不同的值为相同的流。 – 2013-04-07 21:19:45

+0

您是否尝试加载内存中的内容,例如在一个'字符串'和比较'字符串的'hashCode' ?' – Cratylus 2013-04-07 21:22:54

+0

我不喜欢这样的hashCode功能,如果你在编译程序几次通过此功能由哈希有时是同一个文件的不同 – 2013-04-09 17:40:04

相关问题