Hasher 에 들어가서 정수 해쉬 값으로 해싱될 수 있는 타입
in a set or as a dictionary key.
셋과 딕셔너리 키로 사용할 수 있는 타입
자동 제공 타입
String, Integers, Floating-point, Boolean
Optional, Array, Range 는 래핑 타입이 Hashable 이면 Hashable 이 된다.
연관값이 없는 열거형은 자동으로 Hashable conformance 가 된다.
hash(into:) 메서드를 구현하면 커스텀타입도 Hashable 이 될 수 있다.
모든 저장속성이 Hashable 인 struct
연관값이 모두 Hashable 인 열거형은 hash(into:) 메서드가 자동 제공 된다
이 프로토콜은 Equatable 을 상속하고 있다.
키값이 같다면 해시값이 같음을 비교해야하기 때문에
자동으로 제공되는 경우가 아니라면 직접 hash(into:) 를 구현해햐하는데
Equatable 도 같이 구현해주었다. (상속하고 있으므로)
구현하면 Set 에 넣을 수 있고, Dictionary 의 키가 될 수 있다.
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)
}
}
키워드 : 해시 충돌, 해싱, 클러스터
목적 : 데이터의 효율적 관리 ( 검색, 삽입, 삭제의 최적화)
해시 알고리즘을 이용하여 고정된 길이의 암호화된 문자열로 바꾸는 것?
해시 함수 : 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수
매핑 전 원래 값 : 키 (key) 혹은 데이터
매핑 후 값 : 해시 값 ( hash value)
대표적으로 나눗셈법, 곱셈법이 있다
해시함수는 언제나 동일한 해시값을 리턴한다.
해시 값 자체를 인덱스로 사용하기 때문에 삽입, 검색 시간 복잡도가 O(1) 로 매우 빠르다