2

私は iOS の迅速な Tetris チュートリアル* に取り組んでおり、それを完了して動作させています。しかし、私は 1 つの特定の側面、つまり 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

4

2 に答える 2

1

The application is working because it also implements the Equatable protocol:

func ==(lhs: Block, rhs: Block) -> Bool {
    return lhs.column == rhs.column && lhs.row == rhs.row && lhs.color.rawValue == rhs.color.rawValue
}
于 2016-07-03T10:34:35.757 に答える
0

衝突は「一般的にOK」ではありません。基本的な仮定は、 のxハッシュ値がyif and only ifのハッシュ値であるということですx == y。列 2、行 1 を列 1、行 2 と同じと見なす場合は、問題ありません。しかし、私はあなたがそうするとは思わない!アプリケーションは動作しているように見えるかもしれませんが、おそらく、ハッシュ可能性を必要とすることはまだ何もしていません。

于 2015-01-14T23:23:15.250 に答える