誰かが2つの文字列の中からユニークなハッシュを作る方法を考えることはできますか?2つの文字列からユニークなハッシュを作成する
hash(string1,string2) = hash(string2,string1).
を、私はいつも私のマップ内の2つの異なる値の下で、同一の参照を格納することができますが、私は考えた:確実に何か良い方法があるに違いありません...彼らかどうかを確認するために
誰かが2つの文字列の中からユニークなハッシュを作る方法を考えることはできますか?2つの文字列からユニークなハッシュを作成する
hash(string1,string2) = hash(string2,string1).
を、私はいつも私のマップ内の2つの異なる値の下で、同一の参照を格納することができますが、私は考えた:確実に何か良い方法があるに違いありません...彼らかどうかを確認するために
チェックアルファベット順に並べ替えると、それらを連結して結果をハッシュする前でなければ、それらを入れ替えることができます。
あなたは私より41秒速かった:( –
文字列を常に同じ順序で処理できるように、両方の文字列をハッシュする前に "並べ替える"ことができます。
速くしたい、あるいは好きになりたいですか?個々のハッシュコードの対称演算は、あなたが望むものを生成します。 +
、*
、および^
はすべてまともな選択です。 ^
は、2つが同じ場合は0を生成するので、一般的にそれを捕捉するにはif
が必要です。 +
は*
よりも衝突が発生する可能性が高いですが、両方がString
に固有hashCode
方法はかなりお粗末であることを考えるとそれほど大きくない。
scala> "BB".hashCode == "Aa".hashCode // Seriously?!
res40: Boolean = true
あなたの文字列があまり衝突しないようにしたい場合は、文字列にscala.util.MurmurHash.stringHash
を使用します(2.10; 2.10; scala.util.hashing.MurmurHash.stringHash
)、次いで上記方法の1つ。
私は最初の行を理解していませんでした。つまり、 'hash(a)+ hash(b)'はOPが望むものを生成するでしょうか? (ハッシュ(a)+ハッシュ(b)==ハッシュ(b)+ハッシュ(a) ') – laggingreflex
@laggingreflex - それは正しいです。 –
これらを比較し、小さいものを最初の文字列として使用し、大きいものを2番目の文字列として使用します。たぶんあなたはなぜこのような行動をしたいのか説明するべきです。 – martinstoeckli
ハッシュコードは一意ではありません。 – Jesper