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
해시브라운 폼 미쳤다...