Нужно ли возвращать уникальные значения быстрым хешируемым хэш-функциям протокола?
Я работаю над учебником 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
}