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를 만들 수 있나봅니다.
그런데 공식문서에서는 해시에 사용되는 요소가 ==연산자 구현에서 비교할 때 사용되는 요소와 동일해아한다고 말합니다.
The components used for hashing must be the same as the components compared in your type’s == operator implementation.
그리고 Hashable은 Equatable을 상속합니다.
protocol Hashable : Equatable
왜 그럴까요?
https://forums.swift.org/t/why-does-hashable-require-equatable/16817/3
개인적으로는 해시값이 객체를 식별할 수 있는 유일한 값을 제공해주는데, 비교 자체가 안된다면 의미가 없기때문에 Equatable을 상속해서 비교가 가능하게하고, 동일한 객체는 동일한 해시값을 갖도록 한것 아닌가 싶네요
Swift의 String, Double, Bool, Int등 데이터 타입이 Hashable구현되어 있습니다.
아래의 특징을 가진 타입은 Hashable만 상속하면 컴파일러가 자동으로 Hashable을 구현합니다.
Hashable 한 구조체Hashable 한 열거형해시하면 해시브라운이 자동으로 떠오르는데요.
네.
해시브라운은 해시라는 이름을 얻을 자격이 있네요
해시가 뭔지 쉽게 설명해줌
https://www.youtube.com/watch?v=67UwxR3ts2E
해시브라운 폼 미쳤다...