hash๋, ํด์ ํจ์์ ์ํด ์ป์ด์ง๋ ๊ฐ์ผ๋ก ํด์๊ฐ(hashValue), ํด์์ฝ๋, ํด์ ์ฒดํฌ์ฌ์ผ๋ก๋ ๋ถ๋ฆฝ๋๋ค.
hash function, ์์์ ๊ธธ์ด์ ๋ฐ์ดํฐ๋ฅผ ๊ณ ์ ๋ ๊ธธ์ด์ ๋ฐ์ดํฐ๋ก ๋งคํํ๋ ํจ์์ ๋๋ค.
HashTable์์ hash๊ฐ์ ์ฐพ๊ธฐ ์ํด์ key๊ฐ ํ์ํ๊ณ ์ด key๋ unique ํด์ผ ํฉ๋๋ค.
protocol Hashable
๊ณต์๋ฌธ์์ ๋ฐ๋ฅด๋ฉด, Hashable์ด๋ ์ ์ํ์ ํด์๊ฐ์ ์ ๊ณตํ๋ "Hasher"๋ก ํด์ฑ๋ ์ ์๋ ํ์ ์ ์๋ฏธํฉ๋๋ค.
- ์ฐ๋ฆฌ๋ set์ด๋ dictionary์ key๊ฐ์ผ๋ก Hashable ํ๋กํ ์ฝ์ ์ค์ํ๋ ํ์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋๋ค์์ standard library ๋ด์ ํ์ ๋ค์ Hashable์ ์ค์ํ๊ณ ์์ฃ .(String, Integers, Float, Boolean ๋ฑ)
- ๊ทธ ์ธ ๋ค๋ฅธ ํ์ ๋ค์๋ Optional, Array, range ๋ฑ์ด ์๋๋ฐ ์ด๋ค์ type argument๋ค์ด ๋์ผํ๊ฒ ๊ตฌํ๋ ๋ ์๋์ผ๋ก Hashable์ด ๋ฉ๋๋ค. Bool?, [String] ๋ฑ์ด ์์ ์ ์๊ฒ ์ฃ ?
- ๋ํ, associated ๊ฐ์ด ์๋ enum(์ด๊ฑฐํ)์ ์ ์ํ๋ค๋ฉด, enum์ ์๋์ผ๋ก Hashable์ ์ค์ํ๊ฒ๋ฉ๋๋ค.
- ์ปค์คํ ํ์ ์ ๊ฒฝ์ฐ์๋ Hashableํ ํ์ ์ด ๋ ์ ์๋๋ฐ, hash(into: )๋ฉ์๋๋ฅผ ๊ตฌํํ๋ค๋ฉด Hashable ์ค์๊ฐ ๊ฐ๋ฅํด์ง๋๋ค.
- (์ ์ฅ property๋ค์ด ๋ชจ๋ Hashableํ ๊ตฌ์กฐ์ฒด, ๋ชจ๋ Hashableํ enum ํ์ ์ ๊ฐ์ง enum ์ด๋ผ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ hash(into:) ๋ฉ์๋๋ฅผ ์๋์ผ๋ก ์ ๊ณตํฉ๋๋ค.)
๊ฐ์ ํด์ฑํ๋ค๋ ๊ฒ์ ํ์ ๊ตฌ์ฑ ์์(essential component)๋ฅผ ํด์ ํจ์(Hasher ํ์
์ผ๋ก ํ์๋๋)์ ์ ๊ณตํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
ํ์ ๊ตฌ์ฑ ์์๋ ํ์
์ Equatable ๊ตฌํ์ ๊ธฐ์ฌํ๋ ๊ตฌ์ฑ ์์์
๋๋ค. ๋์ผํ ๋ ์ธ์คํด์ค๋ ๊ฐ์ ์์๋ก hash(into:)์์ ๊ฐ์ ๊ฐ์ Hasher์ ๊ณต๊ธํด์ผ ํฉ๋๋ค.
์ฌ๊ธฐ์ Equatable์ ๋ํ ์ธ๊ธ์ด ๋์ค๋ค์. Hashable์ Equatable ํ๋กํ ์ฝ์ ์์ ๋ฐ๊ณ ์์ต๋๋ค.
protocol Equatable {
static func == (lhs: Self, rhs: Self) -> Bool
}
ํด์ฑ์ ํ๊ฒ ๋๋ฉด ํด์๊ฐ์ด๋ผ๋ ์ผ์ ํ ์๋ฆฟ์์ ๊ณ ์ ๊ฐ์ ๋ง๋ค์ด๋
๋๋ค. ์ด ๊ฐ์ด ๊ณ ์ ๊ฐ์ด๋ผ๋ ๊ฒ์ ๋ณด์ฅํ๊ธฐ ์ํด์ Hashable์ ๊ฐ์ด ๋์ผํ ์ง ๋น๊ต ํ ์ ์๋ ํ์
์ธ Equatable์ ์ค์ํฉ๋๋ค. Equatable์ ์ค์ํ๋ ํ์
์ == ํน์ != ์ฌ์ฉํ์ฌ ๋๋ฑ์ฑ์ ๋น๊ตํ ์ ์์ต๋๋ค.
Set, Dictionary์ key๊ฐ ๋ํ ์ค๋ณต์ ํ์ฉํ๋ฉด ์๋๋ ํน์ฑ์ด ์์ต๋๋ค. ๊ทธ๋์ ๊ทธ ํ์ ์์์ ์ ์ผ์ฑ์ด ๋ณด์ฅ๋๋ Hashable์ ์ค์ํ๋ ํ์ ๋ง ๋ฐ๋๋ก ๋์ด์๋ ๊ฒ์ ๋๋ค. Set, Dictionary์ key๊ฐ์ ์ ์ผ์ฑ ๋ณด์ฅ ๋ ธํ์ฐ(?)๋ Hasing๊ธฐ๋ฒ์ด๋ผ๊ณ ํ ์ ์๊ฒ ๋ค์.