Sobes.tech
Junior — Middle

¿Cómo determina Swift la diferencia entre dos objetos en caso de colisión de hash?

sobes.tech AI

Respuesta de la IA

En Swift, el método isEqual(_:) se utiliza para comparar objetos y resolver colisiones de hash. Cuando dos objetos tienen el mismo hash (colisión), el sistema llama adicionalmente a este método para verificar si los objetos son realmente iguales.

Proceso:

  1. Se calcula el hash del objeto mediante hash(into:).
  2. Si dos objetos tienen el mismo hash, se llama a isEqual(_:) para una comparación exacta.
  3. Si isEqual(_:) devuelve true, los objetos se consideran iguales, de lo contrario, diferentes.

Esto permite trabajar correctamente con colecciones como Set o claves en diccionarios, incluso en caso de colisiones de hash.

Ejemplo de implementación:

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

Aquí, si dos objetos Person tienen el mismo hash (por ejemplo, el mismo id), se llamará al operador == para la comparación final.