10

2つの文字列から一意のハッシュを作成する方法を誰かが考えられますか?保証するもの:

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

マップ内の2つの異なる値で同じ参照をいつでも保存できますが、次のように考えました。もっと良い方法があるはずです...

4

4 に答える 4

18

もう 1 つの方法は、文字列と結果の xor の両方をハッシュすることです。xor は可換であるため、順序は関係ありません。ハッシュが等しい場合は、同じ文字列の他のペアとの衝突を避けるために、それらを xor しないでください。

于 2012-10-22T20:31:27.483 に答える
9

あなたは速くなりたいですか、それとも上手になりたいですか?個々のハッシュ コードに対する対称操作は、必要なものを生成します。+*、および^すべて適切な選択です。^2 つが同じ場合は 0 を生成するため、通常、それifをキャッチするには が必要です。+よりも衝突が発生する可能性が高くなりますが、組み込みメソッド onがかなりお粗末で*あることを考えると、どちらもそれほど大きくはありません。hashCodeString

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

文字列があまり衝突しないようにしたい場合はscala.util.MurmurHash.stringHash、文字列 (2.9; scala.util.hashing.MurmurHash.stringHashin 2.10) で使用してから、上記の方法のいずれかを使用します。

于 2012-10-22T22:15:00.880 に答える
8

ハッシュする前に両方の文字列を「順序付け」して、文字列のペアが常に同じ順序で処理されるようにすることもできます。

于 2012-10-22T20:30:16.133 に答える
7

それらがアルファベット順になっていることを確認し、そうでない場合は、連結して結果をハッシュする前にそれらを交換します。

于 2012-10-22T20:29:35.770 に答える