Ответ 1
Другой способ - хешировать как строки, так и результаты. Так как xor коммутативен, порядок не имеет значения. Если хеши равны, не избегайте их столкновения с другими парами одинаковых строк.
Может ли кто-нибудь подумать о способе сделать уникальный хэш из двух строк? Что-то, что обеспечивает:
hash(string1,string2) = hash(string2,string1).
Я всегда могу хранить одну и ту же ссылку под двумя разными значениями на моей карте, но я подумал: должен быть лучший способ...
Другой способ - хешировать как строки, так и результаты. Так как xor коммутативен, порядок не имеет значения. Если хеши равны, не избегайте их столкновения с другими парами одинаковых строк.
Вы хотите быть быстрым или хотите быть хорошим? Любая симметричная операция над отдельными хэш-кодами приведет к тому, что вы хотите; +
, *
и ^
- все подходящие варианты; ^
производит 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), а затем один из приведенных выше методов.
Ну, вы можете попробовать "упорядочить" обе строки перед их хэшированием, чтобы любая пара строк всегда обрабатывалась в том же порядке.
Проверьте, находятся ли они в алфавитном порядке и заменяют их, если они не до того, как их конкатенация и хеширование результата.