2つの文字列から一意のハッシュを作成する方法を誰かが考えられますか?保証するもの:
hash(string1,string2) = hash(string2,string1).
マップ内の2つの異なる値で同じ参照をいつでも保存できますが、次のように考えました。もっと良い方法があるはずです...
もう 1 つの方法は、文字列と結果の xor の両方をハッシュすることです。xor は可換であるため、順序は関係ありません。ハッシュが等しい場合は、同じ文字列の他のペアとの衝突を避けるために、それらを xor しないでください。
あなたは速くなりたいですか、それとも上手になりたいですか?個々のハッシュ コードに対する対称操作は、必要なものを生成します。+
、*
、および^
すべて適切な選択です。^
2 つが同じ場合は 0 を生成するため、通常、それif
をキャッチするには が必要です。+
よりも衝突が発生する可能性が高くなりますが、組み込みメソッド onがかなりお粗末で*
あることを考えると、どちらもそれほど大きくはありません。hashCode
String
scala> "BB".hashCode == "Aa".hashCode // Seriously?!
res40: Boolean = true
文字列があまり衝突しないようにしたい場合はscala.util.MurmurHash.stringHash
、文字列 (2.9; scala.util.hashing.MurmurHash.stringHash
in 2.10) で使用してから、上記の方法のいずれかを使用します。
ハッシュする前に両方の文字列を「順序付け」して、文字列のペアが常に同じ順序で処理されるようにすることもできます。
それらがアルファベット順になっていることを確認し、そうでない場合は、連結して結果をハッシュする前にそれらを交換します。