Hashable
Hashable을 공식 문서에서는 다음과 같이 설명한다. 'A type that can be hashed into a Hasher to produce an integer hash value. -> Hasher에 Hash 하여 정수인 Hash 값을 생성할 수 있는 타입이다.' Hasher는 뭐고 Hash는 뭔가 싶다.
Hasher를 공식 문서에서는 다음과 같이 설명한다. 'The universal hash function used by Set and Dictionary. -> Set와 Dictionary에서 사용하는 일반적인 Hash 함수이다.' Hasher는 Hash 함수를 말하는 거구나. Hash 함수는 뭘까?
Hash 함수를 공식 문서에서는 다음과 같이 설명한다. 'Returns an integer that can be used as a table address in a hash table structure. -> Hash 테이블 구조에서, Hash 테이블 주소로 사용할 수 있는 정수를 반환하게 하는 함수다.' Hash 테이블은 뭘까?
Hash 테이블이 뭔지 알기 앞서, Dictionary를 생각해 보자. Dictionary는 Key-Value 형태로 값을 저장한다. 특정 Key를 던져주면, 그 Key에 해당하는 Value가 나오는 형태다. 이 Dictionary가 Hash 테이블로 구현되어 있다. 그럼 Hash 테이블도 Key-Value 형태로 값을 저장함이 명확하다. 한 가지 더, Hash 테이블은 내부적으로 배열로 구현되어 있다. 무슨 말이냐? 예제를 보자.
다음과 같이, 세 쌍의 Key-Value를 HashTable에 저장하려고 한다.
순서대로 0, 1, 2에 저장된다면 좋겠지만, 그건 일반 배열이지 Hash 테이블이 아니다. Hash 테이블은 데이터가 다음과 같이 순서를 지키지 않고 무작위로 저장된다.
Hash 테이블에 데이터가 위와 같이 저장되어 있고, 우리가 그 데이터를 가져와야 된다고 하자. 우리는 Key(한)으로 1번 Index에 있는 Value(가온)을 가져온다. 마찬가지로, Key(유)로 2번 Index에 있는 Value(재석)을 가져온다. 우리는 오로지 Key 만으로 HashTable에 저장된 Value에 접근해야한다. 의아할 거다. HashTable은 배열로 구현되어 있다. 배열의 Value에 접근하려면 Index를 통해서만 접근할 수 있다. '아! 그러면 Key를 통해서 HashTable의 Index를 알 수 있어야만, 해당 Value에 접근이 가능하겠구나!'라는 생각을 할 수 있다. Key를 해당 Hash 테이블 주소값으로 바꿔주는 역할을 하는 것이 Hash 함수이다.
Hash 테이블이란, Key를 Hash 함수에 집어 넣어서, Hash 테이블 주소값(Hash 테이블의 Index)으로 바꾸고, 이 Hash 테이블 주소값을 통해 Hash 테이블에 접근하여 Value(값)을 가져오거나 저장하는 형태를 말한다.
그럼 다시 Hashable의 공식 문서 설명으로 돌아가보자. 'A type that can be hashed into a Hasher to produce an integer hash value. -> Hasher에 Hash 하여 정수인 Hash 값을 생성할 수 있는 타입이다.' 즉, 'Hash 함수를 통해, 정수인 Hash 테이블 주소값(Hash 테이블의 Index)을 생성할 수 있는 타입이다.'라는 뜻이다. 예를 들어보면,
struct SomeStruct: Hashable {}
SomeStruct 구조체는 Hashable Protocol을 준수한다. 그 말은 SomeStruct 구조체는 Hash 함수를 통해, Hash 테이블 주소값을 생성할 능력이 있다는 것을 의미한다.