Должны ли быстрые хеш-функции протокола с хэшированием возвращать уникальные значения?
Я работаю над руководством по быстрому тетрису для iOS *, и оно завершено и работает. Но я озадачен одним конкретным аспектом - протоколом 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
2 ответа
Столкновения не "в целом нормально". Основное предположение состоит в том, что хэш-значение x
это хэш-значение y
если и только если x == y
, Если вы считаете столбец 2, строка 1 такой же, как столбец 1, строка 2, то все в порядке. Но я не думаю, что вы делаете! Может показаться, что приложение работает, но, вероятно, вы не сделали ничего, что требует хеширования - пока.
Приложение работает, потому что оно также реализует протокол Equatable:
func ==(lhs: Block, rhs: Block) -> Bool {
return lhs.column == rhs.column && lhs.row == rhs.row && lhs.color.rawValue == rhs.color.rawValue
}