Sobes.tech
Junior — Middle

Como o Swift diferencia entre dois objetos em caso de colisão de hash?

sobes.tech IA

Resposta da IA

Em Swift, o método isEqual(_:) é utilizado para comparar objetos e resolver colisões de hash. Quando dois objetos têm o mesmo hash (colisão), o sistema chama adicionalmente esse método para verificar se os objetos são realmente iguais.

Processo:

  1. O hash do objeto é calculado através de hash(into:).
  2. Se dois objetos têm o mesmo hash, isEqual(_:) é chamado para uma comparação exata.
  3. Se isEqual(_:) retorna true, os objetos são considerados iguais, caso contrário, diferentes.

Isso permite trabalhar corretamente com coleções como Set ou chaves em dicionários, mesmo em caso de colisões de hash.

Exemplo de implementação:

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
    }
}

Aqui, se dois objetos Person tiverem o mesmo hash (por exemplo, o mesmo id), o operador == será chamado para a comparação final.