Hashable

Lily·2022년 6월 22일
0

Hashable

Hasher에게 값을 제공해서 정수 hash value를 생성할 수 있는 타입

여기서 hasher, hash value는 무슨 뜻 일까요?

  • hash value : 해시 함수에 의해 얻어지는 값

  • hash function : 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수

    • 동일한 입력값에 대해 동일한 출력값을 내보낸다
    • 입력값이 아주 조금만 바뀌어도 출력값은 어마무시하게 많이 달라진다
    • 항상 단방향으로만 움직인다
  • Hasher : Set과 Dictionary에서 사용되는 해시 함수를 가지는 구조체

해시 함수, 해시값은 데이터의 유일한 식별, 암호화에서 많이 활용됩니다.


구현

Hashable을 채택하면 Hasher에게 input을 제공해 해시 함수로 hash value를 만들 수 있다고 했습니다.
Hasher에게 input을 제공하는 함수가 hash(into:)입니다.

Hashable을 채댁하면 hash(into:)를 필수로 구현해야합니다.
hash(into:)는 타입의 essential component를 Hasher에게 전달합니다.
이것 가지고 hash value만들어줘~ 하는 거죠.

func hash(into hasher: inout Hasher)

예시

struct GridPoint {
    var x: Int
    var y: Int
}

extension GridPoint: Hashable {
    static func == (lhs: GridPoint, rhs: GridPoint) -> Bool {
        return lhs.x == rhs.x && lhs.y == rhs.y
    }

    func hash(into hasher: inout Hasher) {
        hasher.combine(x)
        hasher.combine(y)
    }
}

x, y로 좌표를 정의하는 GridPoint구조체가 있습니다.

hash(into:)에서 hasher에게 x, y를 넘겨줍니다.
combine(_:) 전달 받은 값을 hash value를 만들때 사용할 인풋으로 추가합니다. x,y처럼 여러개의 요소를 섞어서 hash value를 만들 수 있나봅니다.


Equatable과 Hashable의 관계

그런데 공식문서에서는 해시에 사용되는 요소가 ==연산자 구현에서 비교할 때 사용되는 요소와 동일해아한다고 말합니다.

The components used for hashing must be the same as the components compared in your type’s == operator implementation.

그리고 HashableEquatable을 상속합니다.

protocol Hashable : Equatable

왜 그럴까요?


이에 대한 이유는 공식문서에 나와있진 않습니다만, 다양한 추측들이 존재하네요!

https://forums.swift.org/t/why-does-hashable-require-equatable/16817/3

개인적으로는 해시값이 객체를 식별할 수 있는 유일한 값을 제공해주는데, 비교 자체가 안된다면 의미가 없기때문에 Equatable을 상속해서 비교가 가능하게하고, 동일한 객체는 동일한 해시값을 갖도록 한것 아닌가 싶네요


Hashable이 자동으로 구현되는 경우

  1. Swift의 String, Double, Bool, Int등 데이터 타입이 Hashable구현되어 있습니다.

  2. 아래의 특징을 가진 타입은 Hashable만 상속하면 컴파일러가 자동으로 Hashable을 구현합니다.

  • 모든 저장 프로퍼티가 Hashable 한 구조체
  • associatee value가 없는 열거형
  • 모든 associatee value가 Hashable 한 열거형

🍟 Hash와 hashbrown의 관계

해시하면 해시브라운이 자동으로 떠오르는데요.

  • 동일한 감자에 대해 동일한 해시브라운을 내보낸다
  • 감자가 아주 조금만 바뀌어도 해시브라운은 어마무시하게 많이 달라진다
  • 감자에서 튀김만 될 수 있다. 해시브라운에서 감자는 될 수 없다

네.

해시브라운은 해시라는 이름을 얻을 자격이 있네요


References

해시가 뭔지 쉽게 설명해줌
https://www.youtube.com/watch?v=67UwxR3ts2E

profile
i🍎S 개발을 합니다

0개의 댓글