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

Я работаю над руководством по быстрому тетрису для 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
}
Другие вопросы по тегам