Type: Protocol

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

integer hash value를 생성하는 Hasher로 hash 될 수 있는 타입.

한마디로 Hashable Protocol 을 상속받는다는 것은 hash 될 수 있는 타입이라고 한다.

hash 가 될 수 있다는 말은 뭘까? 해시의 기본적인 개념은 생략하고 해시 뜻만 보면,

해시 함수에 의해 얻어지는 값은 해시 값, 해시코드, 해시 체크섬 또는 간단하게 해시라고 한다.

해시가 될 수 있다라는 것은 HashTable 에서 찾을 수 있다는 의미이다. HashTable에서 hash 값을 찾으려면 key가 필요하여 그 key는 식별할 수 있도록 유일해야한다.

Hashable Protocol 의 구조

protocol Hashable: Equatable {
	var hashValue: Int { get }
	func hash(into hasher: inout Hasher)
}

위에서 말했듯 hash값을 찾을 수 있는 key 값인 hashValue가 필요하다.

그런데 Hashable 옆에 상속받는 프로토콜은 뭘까?

Equatable Protocol

Hashable은 Equatable Protocol 을 상속받고 있다.

protocol Equatable {
	static func == (lhs: Self, rhs: Self) -> Bool
}

hashValue는 고유값이어야 하기 때문에 고유값인지 식별해 줄 수 있는 == 함수가 필요하다. 우리가 값을 비교할 때 사용하는 == 연산자가 프로토콜 안에 들어있는 것이다.

우리가 일반적으로 사용하는 Int, String, Double 등등 애플에서 제공하는 다양한 기본 연산자들은 Hashable 타입을 이미 상속받고 있기 때문에 자연스럽게 == 연산자를 사용할 수 있었던 것이다.

Hashable 구현

Hashable로 만들어 주려먼 두 가지가 필요하다.

  1. Equatable에 있는 == 함수를 구현