2012-10-22 18 views
10

誰かが2つの文字列の中からユニークなハッシュを作る方法を考えることはできますか?2つの文字列からユニークなハッシュを作成する

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

を、私はいつも私のマップ内の2つの異なる値の下で、同一の参照を格納することができますが、私は考えた:確実に何か良い方法があるに違いありません...彼らかどうかを確認するために

+0

これらを比較し、小さいものを最初の文字列として使用し、大きいものを2番目の文字列として使用します。たぶんあなたはなぜこのような行動をしたいのか説明するべきです。 – martinstoeckli

+3

ハッシュコードは一意ではありません。 – Jesper

答えて

17

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

+0

私が働いているすべての文字列は、途中で一意です。 – Peter

+0

これが保証されていれば、ハッシュが同じかどうかを確認する必要はありません。 –

+1

これは理論的なCSの観点からはるかに美しいです;) – Joost

6

チェックアルファベット順に並べ替えると、それらを連結して結果をハッシュする前でなければ、それらを入れ替えることができます。

+0

あなたは私より41秒速かった:( –

7

文字列を常に同じ順序で処理できるように、両方の文字列をハッシュする前に "並べ替える"ことができます。

9

速くしたい、あるいは好きになりたいですか?個々のハッシュコードの対称演算は、あなたが望むものを生成します。 +*、および^はすべてまともな選択です。 ^は、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つ。

+0

私は最初の行を理解していませんでした。つまり、 'hash(a)+ hash(b)'はOPが望むものを生成するでしょうか? (ハッシュ(a)+ハッシュ(b)==ハッシュ(b)+ハッシュ(a) ') – laggingreflex

+0

@laggingreflex - それは正しいです。 –

関連する問題