2013-04-07 96 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

相關問題