我正在通过iOS swift俄罗斯方块教程*完成并完成工作。 但我对一个特定的方面感到困惑 - Hashable协议。 功能:
class Block: Hashable, Printable {
[...]
var hashValue: Int { return self.column ^ self.row }
行为0..9,列为0..20。注释说明了这个函数"我们返回我们的行和列属性的异或,为每个块生成一个唯一的整数。"。但我的理解是0 ^ 1将与1 ^ 0等相同...我想知道如果Hash函数不像这样独特,或者碰撞是否正常,是否存在问题?正如我所说,该应用程序似乎工作正常......
* https://www.bloc.io/tutorials/swiftris-build-your-first-ios-game-with-swift#!/chapters/681
答案 0 :(得分:1)
碰撞不"一般都可以"。基本假设是x
的哈希值是y
的哈希值,当且仅当x == y
时。如果您考虑第2列,第1行与第1列第2行相同,那么很好。但我不认为你这样做!该应用程序似乎可行,但可能你没有做任何需要可靠性的事情 - 但是。
答案 1 :(得分:1)
该应用程序正在运行,因为它还实现了Equatable协议:
func ==(lhs: Block, rhs: Block) -> Bool {
return lhs.column == rhs.column && lhs.row == rhs.row && lhs.color.rawValue == rhs.color.rawValue
}