swift 可哈希协议哈希函数是否需要 return 唯一值?
Do swift hashable protocol hash functions need to return unique values?
我正在完成 iOS swift 俄罗斯方块教程*,并已完成并开始工作。
但我对一个特定方面感到困惑 - Hashable 协议。
函数:
class Block: Hashable, Printable {
[...]
var hashValue: Int { return self.column ^ self.row }
行为 0..9,列为 0..20。注释中提到了这个函数 "We return the exclusive-or of our row and column properties to generate a unique integer for each Block."。但我的理解是 0^1 将与 1^0 相同,等等......我想知道如果 Hash 函数不是这样唯一的,或者碰撞通常是可以的,这是否是一个问题?正如我所说,该应用程序似乎运行良好...
*https://www.bloc.io/tutorials/swiftris-build-your-first-ios-game-with-swift#!/chapters/681
碰撞是不是"generally OK"。潜在的假设是 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
}
我正在完成 iOS swift 俄罗斯方块教程*,并已完成并开始工作。 但我对一个特定方面感到困惑 - Hashable 协议。 函数:
class Block: Hashable, Printable {
[...]
var hashValue: Int { return self.column ^ self.row }
行为 0..9,列为 0..20。注释中提到了这个函数 "We return the exclusive-or of our row and column properties to generate a unique integer for each Block."。但我的理解是 0^1 将与 1^0 相同,等等......我想知道如果 Hash 函数不是这样唯一的,或者碰撞通常是可以的,这是否是一个问题?正如我所说,该应用程序似乎运行良好...
*https://www.bloc.io/tutorials/swiftris-build-your-first-ios-game-with-swift#!/chapters/681
碰撞是不是"generally OK"。潜在的假设是 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
}