谁能想到用两个字符串制作唯一哈希的方法?确保:
hash(string1,string2) = hash(string2,string1).
我总是可以在我的地图中将相同的引用存储在两个不同的值下,但我想:一定有更好的方法......
另一种方法是对字符串和结果进行异或运算。由于 xor 是可交换的,因此顺序无关紧要。如果哈希值相等,请不要对它们进行异或运算,以避免与其他相同字符串对发生冲突。
你想快点,还是想变好?对单个哈希码的任何对称操作都会产生你想要的;+
, *
, 和^
都是不错的选择;^
如果两者相同,则产生 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 中),然后使用上述方法之一。
好吧,您可以在散列它们之前尝试“排序”两个字符串,这样任何一对字符串都将始终以相同的顺序处理。
检查它们是否按字母顺序排列,如果不是,则在连接它们并对结果进行散列处理之前交换它们。