Нужно ли возвращать уникальные значения быстрым хешируемым хэш-функциям протокола?

Я работаю над учебником iOS swift Tetris * и завершаю и работаю. Но я озадачен одним аспектом - протоколом Hashable. Функция:

class Block: Hashable, Printable {
    [...]    
    var hashValue: Int { return self.column ^ self.row }

Строки идут 0..9 и Столбцы 0..20. В заметках говорится об этой функции "Мы возвращаем исключительные или наши свойства строки и столбца для создания уникального целого для каждого блока". Но я понимаю, что 0 ^ 1 будет таким же, как 1 ^ 0 и т.д. Я бы хотел знать, является ли проблема проблемой, если функция Хэша не уникальна, или столкновение в целом нормально? Как я уже сказал, приложение работает нормально...

* https://www.bloc.io/tutorials/swiftris-build-your-first-ios-game-with-swift#!/chapters/681

Ответ 1

Столкновения не являются "в общем-то ОК". Исходное предположение состоит в том, что хэш-значение x является хэш-значением y тогда и только тогда, когда x == y. Если вы считаете, что столбец 2, строка 1 такая же, как в столбце 1, строка 2, то штраф. Но я не думаю, что ты это делаешь! Возможно, приложение работает, но, предположительно, вы ничего не сделали, что требует хешируемости.

Ответ 2

Приложение работает, поскольку оно также реализует Equatable protocol:

func ==(lhs: Block, rhs: Block) -> Bool {
    return lhs.column == rhs.column && lhs.row == rhs.row && lhs.color.rawValue == rhs.color.rawValue
}