2014-09-10 98 views
0

假設我有兩個數組,例如[B,D,C,A][B,A,D,C]。什麼機制會在兩個數組(和包含它們元素的排列的任何數組)上產生相同的校驗和?獨立於元素順序的Java數組校驗和

在以下示例中,check_acheck_b將不相等。將元素按字母順序排列不是一種選擇,因爲數組中的對象可能不是字符串或任何可排序的對象。

String[] a = {"B","D","C","A"}; 
String[] b = {"B","A","D","C"}; 

String check_a = a.hashCode(); 
String check_b = b.hashCode(); 
+0

你能否請一些能夠讓我們[你已經嘗試過](http://stackoverflow.com/help/mcve)的代碼能夠證明嗎? – 2014-09-10 11:43:59

回答

1

簡單的例子

public class ArrayHash { 

    public static void main(String[] args) { 
     String[] one = new String[]{"A", "B", "C", "D"}; 
     String[] two = new String[]{"D", "C", "B", "A"}; 
     System.out.println("One = " + one.hashCode()); 
     System.out.println("Two = " + two.hashCode()); 
     System.out.println("Method for one = "+hash(one)); 
     System.out.println("Method for two = "+hash(two)); 
    } 

    private static int hash(Object[] array) { 
     int ret = 0; 
     for (Object c : array) { 
      ret += (124567890 + c.hashCode()) * c.hashCode(); 
     } 
     return ret; 
    } 
} 

它提供了一個輸出

One = 366712642 
Two = 1829164700 
Method for one = 266 
Method for two = 266 

你可以看到,你必須遍歷所有要素和總和(或乘)他們哈希值。無論按照什麼順序,這都會給你同樣的結果。

+0

謝謝你回答我的問題。然而,有沒有辦法讓總和也是唯一的,也就是說,我可以以某種方式確保具有不同條目的兩行不會有相同的校驗和? – karlson 2014-09-11 09:03:32

+0

字符串的哈希碼不是很單一,而且很小,所以總和可以相等。如果你想避免它,你可以嘗試使它更復雜,像'ret + =(1245 + c.hashCode())* 25;'這還不是解決方案,但你可以試試看看它是如何工作的 – 2014-09-11 11:02:00

+0

'ret + =(124567890 + c.hashCode())* c.hashCode();'這應該會更好 – 2014-09-11 11:10:14

1

讓我們假設你有一個獲取元素校驗和的函數。要獲得校驗和,您需要使用Commutative property來查找操作,其中有很多。例如+*^