[swift] Swift에서의 해시 함수 활용 방법

해시 함수는 데이터를 고정된 길이의 값으로 변환하는 함수입니다. Swift에서는 Hashable 프로토콜을 구현하여 해시 가능한 타입을 정의할 수 있습니다. 이번 블로그 포스트에서는 Swift에서 해시 함수를 활용하는 방법에 대해 알아보겠습니다.

해시 가능한 타입 정의하기

해시 가능한 타입을 정의하기 위해서는 다음과 같은 단계를 따라야 합니다.

  1. Hashable 프로토콜을 채택합니다.
  2. Hashable 프로토콜의 요구사항을 구현합니다.
  3. 동등성 비교를 위해 Equatable 프로토콜을 채택합니다.
struct Person: Hashable {
    let name: String
    let age: Int
}

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

위 코드에서 Person 구조체는 Hashable 프로토콜과 Equatable 프로토콜을 구현하고 있습니다.

Set과 Dictionary에서 활용하기

해시 함수를 정의한 타입은 Set이나 Dictionary의 키 타입으로 사용할 수 있습니다. 아래 예시를 살펴보겠습니다.

let john = Person(name: "John", age: 25)
let jane = Person(name: "Jane", age: 30)
let jim = Person(name: "Jim", age: 25)

var personsSet: Set<Person> = []
personsSet.insert(john)
personsSet.insert(jane)
personsSet.insert(jim)

print(personsSet) // [Person(name: "John", age: 25), Person(name: "Jane", age: 30)]

var personsDict: [Person: Int] = [:]
personsDict[john] = 123
personsDict[jane] = 456
personsDict[jim] = 789

print(personsDict) // [Person(name: "Jim", age: 25): 789, Person(name: "John", age: 25): 123, Person(name: "Jane", age: 30): 456]

위 예시에서 Person 타입을 SetDictionary의 키 타입으로 사용하고 있습니다. Person 인스턴스들은 값이 동일하면 같은 키로 간주되어 중복이 제거되거나 마지막 값으로 덮어쓰여집니다.

해시 함수 재정의하기

Swift에서는 기본적으로 Hashable 프로토콜을 구현하여 해시 함수를 자동으로 생성합니다. 하지만 경우에 따라 해시 함수를 재정의해야 할 수도 있습니다. 해시 함수를 재정의하려면 다음과 같은 단계를 따르면 됩니다.

  1. 해시 값을 계산할 프로퍼티를 선택합니다.
  2. hashValue 프로퍼티를 재정의하여 해시 값을 반환합니다.
struct Person: Hashable {
    let name: String
    let age: Int
    
    func hash(into hasher: inout Hasher) {
        hasher.combine(name)
        hasher.combine(age)
    }
}

위 코드에서는 hashValue 프로퍼티를 재정의하는 대신 hash(into:) 메서드를 구현하여 해시 값을 계산하고 있습니다. Hasher.combine() 메서드를 사용하여 계산에 필요한 프로퍼티를 결합합니다.

결론

Swift에서 해시 함수를 활용하기 위해 Hashable 프로토콜을 구현하고 해시 가능한 타입을 정의할 수 있습니다. 이를 통해 Set, Dictionary 등의 자료구조에서 중복 제거나 키-값 쌍의 관리를 더 효율적으로 할 수 있습니다.

더 자세한 내용은 공식 문서를 참고하시기 바랍니다.