티스토리 뷰

iOS & swift

[Swift] Hashable

ggasoon2 2023. 4. 1. 01:58

Struct protocol로 Hashable을 쓰는 경우가 있습니다.

 

import Foundation

struct Landmark: Hashable, Codable {
    var id: Int
    var name: String
    var park: String
    var state: String
    var description: String
}

 

이렇게 Fetch할 구조체 모델에 Hashable을 사용하기도 합니다.

 

Hashable에 대해 알아보겠습니다.

 

https://developer.apple.com/documentation/swift/hashable

 

Hashable | Apple Developer Documentation

A type that can be hashed into a to produce an integer hash value.

developer.apple.com

정의: Hashable는 정수 해시값을 생성하게하는 Hash가 가능한 타입이라고합니다.

 

그럼 Hash가 무엇이냐.

 

Hash는 데이터를 관리 및 유지하는 자료구조로 

데이터들을 하나의 규칙(Hash Function)으로 분류하고, 그 분류(Key)에 따라 해당 값(Value)를 저장하는 형태를 뜻합니다.

 

일단 이렇다 하는데 예제코드를 보면 바로 아실수 있을거라고 생각합니다.

 

Hashable protocol을 사용하기위해서는 hash(into:) method 를 꼭 구현해야하는데

이 메소드는 Hash object를 입력받고, 해시되는 유형의 타입을 명시해야합니다.

 

struct Person: Hashable {
    var name: String
    var age: Int

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

 

이런식으로 Person구조체가 Hash형태 준수하도록 구현해줄 수 있습니다.

이 구현에서 hasher.combine() method를 사용하여 name과 age 속성을 갖는 해시 구조체를 생성했다고 합니다.

 

dictionary 또는 set 유형의 hash 값을 사용해 빠르게 원하는 값을 찾을 수 있습니다.

 

예시입니다.

 

struct Person: Hashable {
    var name: String
    var age: Int
    
    func hash(into hasher: inout Hasher) {
        hasher.combine(name)
        hasher.combine(age)
    }
}

var ageDictionary = [Person: Int]()

let alice = Person(name: "Alice", age: 25)
let bob = Person(name: "Bob", age: 30)

ageDictionary[alice] = alice.age
ageDictionary[bob] = bob.age

print(ageDictionary[alice]) // Output: Optional(25)

 

Hashable 구조체 Person을 만들고 해당 Person을 Key값으로하는 ageDictionary를 생성할 수 있습니다.

그러고 해당 dict의 key값으로 alice라는 Person객체와 bob이라는 객체를 넣을 수 있으며,

 

 

ageDictionary[key값]으로 배열에 빠르게 탐색이 가능합니다.

 

 

어느정도 빠르게 접근이 가능하냐면

기존 배열의 index값에 해당하는 value를 탐색할때는 O(n)이 걸리는데에 반해

해시로 탐색할 경우 O(1)이 걸린다고 합니다.

 

 

대신에 메모리영역에서 많은 공간을 차지한다고 합니다.

 

 

그래서 자주 찾게되고 공간이 많이 차지하지 않는 배열을 탐색할때 Hash화 하여 사용하면 좋은듯 합니다.

 

 

 

댓글