2012-10-22 48 views
10

任何人都可以想辦法做一個唯一的哈希出兩個字符串的?一些保證:做出獨特的哈希出兩串

hash(string1,string2) = hash(string2,string1).

我總能存儲下我的地圖兩個不同的值相同的參考,但我認爲:必須有一個更好的辦法...

+0

比較他們,並使用作爲第一串較小,因爲第二個字符串更大。也許你應該解釋一下,爲什麼你想要這樣的行爲。 – martinstoeckli

+3

哈希碼不是唯一的。 – Jesper

回答

17

另一種方法是散列兩個字符串和XOR結果。由於xor是可交換的,所以順序無關緊要。如果哈希值相等,則不要對它們進行異或以避免與其他對相同的字符串發生衝突。

+0

似乎是正確的我,每次我工作串的方式是獨一無二的。 – Peter

+0

如果有保證的,你甚至都不需要檢查是否哈希值是相同的。 –

+1

雖然排序也會起作用,理論上CS理論上這當然更漂亮;) – Joost

6

檢查,看看他們是否'按字母順序排列,如果它們不是連接在一起並散列結果,則將它們交換。

+0

你是比我快41secs :( –

7

那麼你可以嘗試「排序」散列他們之前都是字符串,因此,任何對字符串總是以相同的順序進行處理。

9

你要快,不然你想好?對各個散列碼的任何對稱操作都會產生你想要的; +,*^都是不錯的選擇;如果兩者相同,則^產生0,所以您通常需要if來捕捉; +更容易產生碰撞比*但都沒有那麼大因爲在String內在hashCode方法是非常糟糕:

scala> "BB".hashCode == "Aa".hashCode // Seriously?! 
res40: Boolean = true 

如果你希望你的字符串不會發生衝突那麼多,對字符串使用scala.util.MurmurHash.stringHash (2.10中爲2.9; scala.util.hashing.MurmurHash.stringHash),然後是上述方法之一。

+0

我不明白第一行,你的意思是'hash(a)+ hash(b)'會產生OP想要的嗎? (即'hash(a)+ hash(b)== hash(b)+ hash(a)') – laggingreflex

+0

@laggingreflex - 這是正確的。 –