SwissTable
SwissTable์ ํด์ํ ์ด๋ธ์ ์ต์ ํ๋ ๊ตฌํ ํํ ์ค ํ๋๋ค.
2017๋ ์ ๊ตฌ๊ธ์์ ์ฒ์ ๊ณต๊ฐํ์ผ๋ฉฐ, ์ฒ์ ๊ณต๊ฐ๋ ๊ตฌํ ๋ฒ์ ์ C++์ด์๋ค.
์ด์ ์ ์กด์ฌํ๋ ํด์ํ ์ด๋ธ์ ๋นํด์ ๋์ฒด๋ก ์ฐ์ํ๊ณ , ๋ฑํ ๋จ์ ๋ ์์ด์ ์ผ๋ถ ์ธ์ด๋ค์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด๊ฑธ๋ก ๋์ฒด๋์๋ค.
๋ํ์ ์ผ๋ก Rust์ std Hashmap(since 1.35), Go์ ๊ธฐ๋ณธ map(since 1.24)์ด swisstable ๊ตฌํ์ฒด๋ค.
๊ฑฐ์ ์ต์ด๋ก ์ ๋ฉด ๋์
ํ๊ฒ Rust ์ชฝ ํ๊ฒฝ์ธ ๊ฒ ๊ฐ๋๋ผ.
๊ณ ์ ์ ์ธ ํด์ํ ์ด๋ธ
๋๋ถ๋ถ์ ์ธ์ด์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ํด์ํ ์ด๋ธ ๊ตฌํ์ฒด๊ฐ ๋ค์ ๋ฐฉ์์ ๋ฐ๋ฅธ๋ค.
ํด์ํ
์ด๋ธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ทธ๋ฅ ๋ฐฐ์ด์ด๋ค.
Tom์ด๋, John์ด๋ ํ๋ ์์์ ํค๊ฐ์ด ๋ค์ด์ค๋ฉด ๊ทธ๊ฑธ ํด์ํจ์ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ ๋ฐฐ์ด ์ธ๋ฑ์ค์ ๋งคํ์์ผ ์ ์ฅํ๋ ๊ฒ์ด๋ค. ๋ณดํต ์ ๋ฐฐ์ด์ backing array์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๊ทผ๋ฐ ๋ฌธ์ ๋ ํด์๊ฐ์ด ํญ์ ์ถฉ๋ํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
๋ค๋ฅธ ๊ฐ์ด ๋์ผํ๊ฒ 3 ์ธ๋ฑ์ค๋ก ๋งคํ๋๋ฉด ์ด๋ป๊ฒ ํ ๊ฒ ๊ฐ์๊ฐ?
๋ฐฉ๋ฒ 1: Chaining
์๋น์์ ํด์ํ
์ด๋ธ ๊ตฌํ์์๋ ์์ ๊ทธ๋ฅ ๋ฐฐ์ด ์์ ๋ด๋ถ์ Linked List๋ฅผ ๋ฃ๊ณ , ํ ํค๋ง๋ค ์ฌ๋ฌ๊ฐ๋ฅผ ๋ฃ์ ์ ์๋๋ก ์์ธ์ฒ๋ฆฌ๋ฅผ ํด๋๋ค.
๊ทธ๋์ ํด์ ์ถฉ๋์ด ๊ทน์ฌํ๊ฒ ๋ฐ์ํ๋ค๋ฉด ํ ์์์ ๋ฐ์ดํฐ ํฌ๊ธฐ๊ฐ ๋น๋ํด์ ธ์ ์ฝ์ /์ญ์ /์กฐํ ์๊ฐ ๋ฑ์ด O(N)์ ๊ฐ๊น๊ฒ ๋์ฌ ์๋ ์๋ค๋ ๋จ์ ์ด ์๋ค. ๋ฌผ๋ก ํด์ํจ์ ์ฑ๋ฅ์ ๋ฐ๋ผ์ ๊ฐ๋ฆฌ๋ ๋ถ๋ถ์ด๊ธด ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ์ด ๋จ์ํ ์ฝ์ ๋๊ฑฐ๋ ์ถฉ๋๋ ๋๋ง๋ค ๋์ ํ ๋น์ด ๋ฐ์ํ๋ค๋ ๋จ์ ๋ ์๊ณ , Linked List ํน์ ์ ์บ์ ๋น์นํ์ฑ๋ ๊ณ ์ง์ ์ธ ํ๊ณ ์ค ํ๋๋ผ๊ณ ํ ์ ์๋ค.
๋ฐฉ๋ฒ 2. probing
์ด๊ฑฐ ๋ง๊ณ probing(์กฐ์ฌ)๋ผ๊ณ ํ๋ ๋ฐฉ๋ฒ๋ ์์๋ค. open addressing์ด๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
์ฌ์ฉ ๋น๋๋ chaining๋ณด๋ค ๋ฎ๊ธด ํ๋๋ฐ, ๊ทธ๋๋ ๊ฝค ์ฐ๊ธด ์ผ๋ค.
์ฌ์ค ์๋ฆฌ๋ ๋ณ๊ฑฐ ์๋ค.
๊ทธ๋ฅ ๋น ๊ณต๊ฐ ์์ผ๋ฉด ์๋ฌด๋ฐ๋ ์ ์ฅํ๋ ๊ฒ์ด๋ค. ๊ทธ ์๋ฌด๋ฐ๋๋ฅผ ์ด๋ป๊ฒ ์ ํ ์ง๋ ๊ตฌํ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ์ ๋ค๋ฅด๋ค.
๊ฐ์ฅ ๋จ์ํ ๋ฐฉ๋ฒ์ ๊ทธ๋ฅ ์ถฉ๋์ด ๋ฐ์ํ ๋ค์ ์ธ๋ฑ์ค์ ์ ์ฅํ๋ ๊ฒ์ด๋ค.
์ด๋ฐ ์์ผ๋ก ๋ง์ด๋ค.
์ด๋ฌ๋ฉด ์ถ๊ฐ ํ ๋น์ด Chaining์ ๋นํด์๋ ์ ์ ์ ์์ด์ ๋๋ฆ ๋์์ง ์์๋ฐ, ์ถฉ๋์ด ๋น๋ฒํ๊ฒ ๋ฐ์ํ๊ฑฐ๋ ๋น Key๊ฐ ์ ์ด์ง๋ค๋ฉด ์ฑ๋ฅ์ด ๊ธ๊ฒฉํ๊ฒ ๋จ์ด์ง๋ค๋ ๋จ์ ์ด ์๋ค.
https://hyoeun-log.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-11%EC%9E%A5-%ED%95%B4%EC%8B%9C-%ED%85%8C%EC%9D%B4%EB%B8%94
์ฌ์ค ์ด๋ฐ ๋ถ์์ ์ฑ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก ์ ์ฐ์ด์ง๋ ์๋๋ฐ, Python์ dict ๊ตฌํ ์ ๋๊ฐ ์ข ํน์ดํ๊ฒ probing ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋์๋ค.
๋ฌผ๋ก ์ด๊ฑธ ๊ทธ๋ฅ ์ฐ๋ฉด ๊ฝ์ฐผ์๋ ์ฑ๋ฅ์ด ์์๋๊ธฐ ๋๋ฌธ์ ์์ฉ๋, ๊ทธ๋ฌ๋๊น load factor์ ๋ ๋ฏผ๊ฐํ๊ฒ ์ก์๋จ๋ค.
Swisstable
swisstable์ ์ฝ๊ฒ ๋งํ๋ฉด ์ด์ ์ ๋ฐ์ฏค ๋ฒ๋ ค์ก๋ open addressing Hashtable์ ๋ณ์ข
์ด๋ผ๊ณ ํ ์ ์๋ค.
๊ทธ ๊ธฐ๋ณธ ์๋ฆฌ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋จํ ์ ๋ฆฌํด๋ณด๊ฒ ๋ค.
Hash ๊ฐ ๊ตฌ์กฐ
swisstable์ ํด์๊ฐ์ ๋ฐ๋์ 8๋ฐ์ดํธ ์ ์์ฌ์ผ ํ๋ค.
์๋๋ฉด ๋นํธ๋จ์๋ก ์ชผ๊ฐ์ ๋ณ๊ฐ์ 2๊ฐ์ง ๊ฐ์ ๋์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.
https://abseil.io/about/design/swisstables
๊ทธ๋์ ์์ 57๋นํธ๋ฅผ ์ฐ๋ฆฌ๊ฐ ์๋ ์๋ ํ
์ด๋ธ ๋ถ๋ฐฐ์ฉ ํค๋ก ์ฌ์ฉํ๋ค. ์ ๊ฒ ๊ฐ์ผ๋ฉด ๊ฐ์ ํค๊ณ , ํค๊ฐ ๊ฐ์ผ๋ฉด ์ถฉ๋์ด ๋ฐ์ํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ํ์ 7๋นํธ๋ ์ถฉ๋์ด ๋ฐ์ํ์ ๊ฒฝ์ฐ, probing์ ์ํ ํ๋จ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉ๋๋ค.
Probing
๋ฐฉ๊ธ ์ธ๊ธํ 7๋นํธ H2 ๊ฐ์ ์ถฉ๋ ๋ฐ์ ์ probing์ ์ํ ๋ถ๊ฐ ๊ฐ์ผ๋ก ์ฌ์ฉํ๋ค.
H1 ํค๊ฐ์ด ๊ฐ๋๋ผ๋ ์ค์ ๊ฐ์ด ๋ค๋ฅด๋ฉด H2 ๊ฐ์ด ๋ค๋ฅผ ํ๋ฅ ์ด ๋งค์ฐ ๋์ผ๋, ๊ทธ๊ฑธ ๊ธฐ์ค์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ๋ค์ ๋ถ๋ฐฐํด์ ์ ์ฅํ๋ ๊ฒ์ด๋ค.
๋ฌผ๋ก ์ด๊ฒ๋ ๊ฒฐ๊ตญ ํด์๋๊น, ์ค์ ์๋ณธ ๊ฐ์ด ๋ค๋ฅด๋๋ผ๋ H2 ๊ฐ์์๋ ํด์ ์ถฉ๋์ด ๋ฐ์ํ ์๋ ์๋ค.
๊ทธ๋์ ๊ตฌํ์์ ์์ธ์ฒ๋ฆฌ๋ ํด์ผ๊ฒ ์ง๋ง ํ๋ฅ ์ด 1/128 (2^7)๋ก ๋ฎ์์ ๊ฑฑ์ ํ ์ผ์ ๋ณ๋ก ์๊ธด ํ๋ค.
SIMD
H2๋ก ๋ถ์ฐ์ ํ๋ ์ด์จ๋ , Probing์ ์ด์จ๊ฑฐ๋ H2 ๊ฐ ๊ธฐ๋ฐ์ผ๋ก ๋น์๋ฆฌ๊ฐ ๋์ฌ๋๊น์ง ์ฐพ์์ผ ํ๋ค.
๊ทธ๋ฌ๋ฉด ๊ฐ์ ๊ทธ๋ฃน(H1 ์ถฉ๋ ๋์)์์ H2 ๊ฐ ๊ธฐ๋ฐ์ผ๋ก ์ฌ๋ฌ๋ฒ ๋ค์ ธ์ผํ ์๋ ์๋๋ฐ, ๊ทธ๋ ๊ฒ ํ๋ค๋ฉด ์๋ฌด๋๋ ์ฑ๋ฅ์ ๋นํจ์จ์ ์ธ ๋ถ๋ถ์ด ๋ฐ์ํ ์ ์๋ค.
๊ทธ๋์ swisstable์ SIMD๋ฅผ ์์ฉํด์ ๋ณ๋ ฌ ์ต์ ํ๋ฅผ ๋ฌ์ฑํ๋ค.
์ด์ฐจํผ H2๋ 1๋ฐ์ดํธ์ง๋ฆฌ ์์ ํด์๊ฐ์ด๋๊น, SIMD์ 8๊ฐ-16๊ฐ์ฉ ์ฐ๊ฒจ๋ฃ๊ณ ํ๋ฒ์ ๋น๊ตํด์ ๋น ๋ฅด๊ฒ ์์น๋ฅผ ์ฐพ์ ์ ์๋ ๊ฒ์ด๋ค.
์ค์ฑ๋ฅ
swisstable์ด ๊ธฐ์กด์ hashtable๊ณผ ๋น๊ตํด์ ๋น ๋ฅด๊ณ ์์ ์ ์ด๊ธฐ๋ ํ๋ค๋ ๊ฒ์ ๋ณ๋ก ์ด๋ก ์ ์ฌ์ง๊ฐ ์๋ค.
๊ฒ์ฆ๋ ๊ฑฐ์ ๋๋ฌ๊ณ ์ฌ์ฉ์ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์๋ค.
์ถ๊ฐ ํ ๋น์ ๋จ๋ฐํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์์๋ ๋ฐฐ์ด๊ณผ ๊ฑฐ์ ๋๋ฑํ ์์ค์ด๋ค.
CPU ๋ฆฌ์์ค ๊ธฐ์ค์ผ๋ก๋ ์ค์ ์๋๋ 2๋ฐฐ ์ ๋ ๋น ๋ฅด๋ค๊ณ ํ๋, ์ด๊ฑด ์กฐ๊ธ ๊ตฌํ ๋ฐฉ์๊ณผ ํ๊ฒฝ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์๋ค.
์ธ์ด ํ๊ฒฝ์ ๋ฐ๋ผ์ (ํนํ Java์ ๊ฒฝ์ฐ) CPU Time ์์ฒด๊ฐ ๊ทน์ ์ผ๋ก ์ค์ด๋ค์ง๋ ์๋๋ค๋ ์๊ฒฌ๋ ์๋๋ผ
์ฐธ์กฐ
https://go.dev/blog/swisstable
https://github.com/rust-lang/hashbrown
https://abseil.io/about/design/swisstables
https://stackoverflow.com/questions/9010222/why-can-a-python-dict-have-multiple-keys-with-the-same-hash
https://dev.to/huizhou92/swisstable-a-high-performance-hash-table-implementation-1knc
https://leventov.medium.com/smoothiemap-2-the-lowest-memory-hash-table-ever-6bebd06780a3