Сделать уникальный хэш из двух строк

Может ли кто-нибудь подумать о способе сделать уникальный хэш из двух строк? Что-то, что обеспечивает:

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

Я всегда могу хранить одну и ту же ссылку под двумя разными значениями на моей карте, но я подумал: должен быть лучший способ...

Ответ 1

Другой способ - хешировать как строки, так и результаты. Так как xor коммутативен, порядок не имеет значения. Если хеши равны, не избегайте их столкновения с другими парами одинаковых строк.

Ответ 2

Вы хотите быть быстрым или хотите быть хорошим? Любая симметричная операция над отдельными хэш-кодами приведет к тому, что вы хотите; +, * и ^ - все подходящие варианты; ^ производит 0, если два одинаковые, поэтому вам обычно нужен if, чтобы поймать это; + с большей вероятностью генерирует столкновения, чем *, но оба они не настолько велики, учитывая, что собственный метод hashCode на String довольно паршивый:

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

Если вы хотите, чтобы ваши строки не сталкивались так сильно, используйте scala.util.MurmurHash.stringHash для строк (2.9; scala.util.hashing.MurmurHash.stringHash в 2.10), а затем один из приведенных выше методов.

Ответ 3

Ну, вы можете попробовать "упорядочить" обе строки перед их хэшированием, чтобы любая пара строк всегда обрабатывалась в том же порядке.

Ответ 4

Проверьте, находятся ли они в алфавитном порядке и заменяют их, если они не до того, как их конкатенация и хеширование результата.