10

谁能想到用两个字符串制作唯一哈希的方法?确保:

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

我总是可以在我的地图中将相同的引用存储在两个不同的值下,但我想:一定有更好的方法......

4

4 回答 4

18

另一种方法是对字符串和结果进行异或运算。由于 xor 是可交换的,因此顺序无关紧要。如果哈希值相等,请不要对它们进行异或运算,以避免与其他相同字符串对发生冲突。

于 2012-10-22T20:31:27.483 回答
9

你想快点,还是想变好?对单个哈希码的任何对称操作都会产生你想要的;+, *, 和^都是不错的选择;^如果两者相同,则产生 0,因此您通常需要 anif来捕捉它;+更容易产生碰撞,*但两者都不是很好,因为内在hashCode方法String非常糟糕:

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

如果您希望您的字符串不会发生太多碰撞,请scala.util.MurmurHash.stringHash在字符串上使用(2.9;scala.util.hashing.MurmurHash.stringHash在 2.10 中),然后使用上述方法之一。

于 2012-10-22T22:15:00.880 回答
8

好吧,您可以在散列它们之前尝试“排序”两个字符串,这样任何一对字符串都将始终以相同的顺序处理。

于 2012-10-22T20:30:16.133 回答
7

检查它们是否按字母顺序排列,如果不是,则在连接它们并对结果进行散列处理之前交换它们。

于 2012-10-22T20:29:35.770 回答