Sobes.tech
Junior — Middle

Как определя Swift разликата между два обекта при сблъсък на хешове?

sobes.tech AI

Отговор от AI

В Swift за сравнение на обекти и разрешаване на колизии на хешове се използва методът isEqual(_:). Когато два обекта имат еднакъв хеш (колизия), системата допълнително извиква този метод, за да провери дали обектите наистина са равни.

Процес:

  1. Изчислява се хешът на обекта чрез hash(into:).
  2. Ако двата обекта имат еднакъв хеш, се извиква isEqual(_:) за точно сравнение.
  3. Ако isEqual(_:) връща true, обектите се считат за равни, иначе — за различни.

Това позволява коректна работа с колекции като Set или ключове в речници, дори при колизии на хешове.

Пример за реализация:

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

Тук, ако при два обекта Person хешът съвпадне (например, еднакъв id), ще бъде извикан операторът == за окончателно сравнение.