Sobes.tech
Junior — Middle

Hogyan különbözteti meg a Swift két objektumot a hash ütközése esetén?

sobes.tech MI

Válasz az MI-től

Swiftben az isEqual(_:) módszert használják az objektumok összehasonlítására és a hash ütközések feloldására. Amikor két objektumnak ugyanaz a hash értéke (ütközés), a rendszer további lépésként meghívja ezt a módszert, hogy ellenőrizze, valóban egyenlőek-e az objektumok.

Folyamat:

  1. Az objektum hash értékét a hash(into:) segítségével számítják ki.
  2. Ha két objektumnak ugyanaz a hash értéke, akkor a pontos összehasonlításhoz meghívják az isEqual(_:)-t.
  3. Ha az isEqual(_:) true értéket ad vissza, az objektumokat egyenlőnek tekintik, különben különbözőek.

Ez lehetővé teszi, hogy helyesen működjön a Set vagy a szótárak kulcsai, még hash ütközések esetén is.

Implementációs példa:

class Person: Hashable {
    let id: Int
    let name: String

    func hash(into hasher: inout Hasher) {
        hasher.combine(id)
    }

    static func == (lhs: Person, rhs: Person) -> Bool {
        return lhs.id == rhs.id && lhs.name == rhs.name
    }
}

Itt, ha két Person objektumnak ugyanaz a hash értéke (például ugyanaz az id), akkor a végső összehasonlításhoz az == operátor lesz meghívva.