2010-12-10 81 views
2

這是計算Map的哈希碼的最佳途徑,知道它可能包含的類型,如項值:StringIntegerObject[] ...?的Java地圖哈希碼

Map.hashCode()返回一個淺的散列碼。這意味着如果您的地圖中有String[],則Map.hashCode()也將使用String[]返回的散列。不幸的是,這不是我想要的(Object.hashCode()實現)。但我想要Arrays.hashCode(String[])實施。

那麼最好的,通用的方法來處理呢?

+1

我認爲你的地圖是不可變的?如果你添加/刪除條目,你的基於值的hashCode()是註定的。 – 2010-12-10 17:37:17

+0

我想大多數人最初的問題將是「爲什麼?」你在做什麼,你需要改變地圖的哈希碼?計算一個「深」哈希碼可能會使該操作相當昂貴... – 2010-12-10 17:37:22

+1

@Kirk Woll:請詳細說明,這有什麼意義? – javaq 2010-12-10 17:40:01

回答

5

如果您需要知道兩個地圖是否包含相同的值,則需要編寫一個深度比較方法。你不應該依賴於hashCode。即使使用完美的算法,也不可能每個可能的對象的每個可能的集合都可以由一個有符號的整數唯一地表示。

Hashcode方法僅僅是碰撞減少在收藏時,它不應該被用來唯一標識對象。

+0

謝謝。你知道任何其他有效的方法來實現我的目標嗎? – javaq 2010-12-10 19:21:01

+1

如果您需要知道兩個集合*完全相同,除深度比較之外沒有其他方法可以實現。 *不相同的東西可能會很快失敗,但最壞的情況是總是比較每個內部對象,包括每個內部集合的內部比較...... – 2010-12-10 19:33:03

3

你的問題的解決方案是不使用數組。使用ArrayLists(或其他形式的List,就像Google Guava的ImmutableList一樣)。列表哈希你想要的方式。另外,數組並不真正適合泛型(比如Maps)。

+0

這不是一個解決方案。我無法控制輸入。最終我可以遞歸地用數組列表替換數組,但是我會避免這種情況。 – javaq 2010-12-10 17:38:05