What is a Fibonacci Hashing? - minseok127/HashSimulator GitHub Wiki
Fibonacci Hashing
Fibonacci Hashing์ Multiplicative Hashing์ ์ฌ์ฉํ ๋ ์ด๋ค ์์๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ์ง์ ๋ํ ์ง๋ฌธ์์ ์์๋ฉ๋๋ค.
์ด๋ฒ ํ์ด์ง์์๋ Fibonacci๋ผ๋ ๊ฐ๋ ์ด Multiplicative Hashing๊ณผ ์ด๋ค ์ฐ๊ด์ด ์๋ ์ง ์์๋ณด๊ฒ ์ต๋๋ค.
Contents
The three distance theorem
{x} = x - |_x_| ์ด๊ณ , ฮธ๋ฅผ irrational number๋ผ๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
๋ง์ฝ 0์์ ์์ํ๊ณ 1์์ ๋๋๋ ์ ๋ถ ์์ ๊ฐ๊ฐ {ฮธ}, {2ฮธ}, ... , {nฮธ} ์ ๊ธธ์ด๋ฅผ ๊ฐ์ง๋ ์ ๋ค์ด ์กด์ฌํ๋ค๋ฉด
ํ์ฌ ์ด ์ ๋ถ ์์๋ n + 1๊ฐ์ ์ ๋ถ๋ค์ด ํ์ฑ๋์ด์๋ ์ํฉ์ ๋๋ค.
The three distance theorem์ ๋ฐ๋ฅด๋ฉด ์ด๋ฌํ n + 1๊ฐ์ ์ ๋ถ๋ค์ ์ต๋ 3๊ฐ์ ์๋ก ๋ค๋ฅธ ๊ธธ์ด๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
๋ํ {(n + 1)ฮธ}์ ํด๋นํ๋ ์ ์ ํ์ฌ๊น์ง ๋ง๋ค์ด์ง ๊ฐ์ฅ ๊ธด ์ ๋ถ ์ค ํ๋์ ์ฐํ๊ฒ ๋ฉ๋๋ค.
ฮธ์ n์ ๋ฐ๋ผ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ ๋ถ์ด ๋ณํํ๋ ์ง๋ Wolfram์์ ํ์ธํ ์ ์์ต๋๋ค.
Bad Break
The three distance theorem์ ์ฑ์ง์๋ ์๋ก์ด ์ ์ด ๊ธฐ์กด์ ์ ๋ถ ์ค ๊ฐ์ฅ ๊ธด ๊ฒ์ ๋๋๋ค๋ ๊ฒ์ด ์์ต๋๋ค.
The Art of Computer Programming, vol. 3 by Donald Knuth๋ ์ด๋ ๊ฒ ๋๋์ด์ง ์ ๋ถ์ ๋ํด์
ํ ์ชฝ์ด ๋ค๋ฅธ ์ชฝ๋ณด๋ค 2๋ฐฐ ์ด์ ํฐ ์ํฉ์ Bad Break์ด๋ผ ์ ์ํ์ต๋๋ค.
์๋ฅผ ๋ค์ด ฮธ๊ฐ 0.9999...๋ผ๊ณ ๊ฐ์ ํด๋ณธ๋ค๋ฉด ํ ์ชฝ์ ๋ค๋ฅธ ์ชฝ์ ๋นํด ๋งค์ฐ ์์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
์ด๋ฌํ ์ํฉ์์๋ ์๋กญ๊ฒ ์ถ๊ฐ๋๋ ์ ๋ค์ด 0์์ 1 ์ฌ์ด์ ๋ฌด์์ํ๊ฒ ์์นํ์ง ์๊ณ , ํ์ชฝ ๋์ ๋ชฐ๋ ค์ ๋ํ๋๊ฒ ๋ฉ๋๋ค.
Fibonacci ratio
Fibonacci ratio๋ (โ5 - 1) / 2 ๋ก ๋๋ต 0.6180339887... ์ด๋ผ๋ ๊ฐ์ ๋ํ๋ ๋๋ค.
ฮธ๋ฅผ Fibonacci ratio๋ก ์ค์ ํ ๊ฒฝ์ฐ Bad Break๊ฐ ๋ฐ์ํ์ง ์๋ ๋ค๋ ํน์ง์ด ์์ต๋๋ค.
์ฆ ์๋ก์ด ์ ๋ค์ด 0๊ณผ 1 ์ด๋ ํ์ชฝ์ ํธํฅ๋์ด ๋ํ๋์ง ์๊ณ , ๋ฌด์์ํ๊ฒ ๋ํ๋ฉ๋๋ค.
Constant
๊ทธ๋ ๋ค๋ฉด ์ด๋ฌํ ๋น์จ๋ค์ด Constant์ ์ด๋ค ์ฐ๊ด์ด ์์๊น์?
Multiplicative Hashing์ ๋ํ๋ด๋ ์์์ ๋ค์ ์ ์ด๋ณด๋ฉด
h(k) = |_ M * ( (A / w) * K mod 1 ) _| // ex) |_ x _| : x๋ณด๋ค ํฌ์ง ์์ ์ ์, A mod B : A๋ฅผ B๋ก ๋๋ ๋๋จธ์ง
์ด์ ๊ฐ์ด ๋ํ๋ผ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ (A / w)๋ฅผ ฮธ๋ก ์๊ฐํด๋ณธ๋ค๋ฉด (A / w) * K mod 1์ {Kฮธ}๋ก ํํํ ์ ์์ต๋๋ค.
์ฆ key์ ๋ฐ๋ผ์ ๋ณํํ๋ (A / w) * K mod 1์ ์์ง์์ Wolfram์์ ํ์ธํ๋ ์ ๋ค์ ์์ง์์ผ๋ก ์๊ฐํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด A๋ฅผ w * Fibonacci ratio ๋ผ๊ณ ์๊ฐํ๋ค๋ฉด (A / w) * K mod 1 ์ 0๊ณผ 1 ์ฌ์ด์์ Randomํ๊ฒ ๊ฒฐ์ ๋๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
๋ฐ๋๋ก (A / w)๋ฅผ Bad Break๊ฐ ํฌ๊ฒ ๋ฐ์ํ๋ ๊ฐ์ผ๋ก ์๊ฐํ๋ค๋ฉด (A / w) * K mod 1 ์ 0 ํน์ 1 ์ชฝ์ ํธํฅ๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ hash code๊ฐ ์ข์ ๊ตฌ๊ฐ์์ ๋์ ๋น๋๋ก ๋ฐ์ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
Sequential data
์ผ๋ฐ์ ์ผ๋ก Multiplicative Hashing์์ A๋ฅผ Fibonacci ratio์ ๋ฐ๋ผ ๊ฒฐ์ ํ๋ฉด ์ถฉ๋ถํ Randomํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
ํ์ง๋ง ๋ง์ฝ ์ฃผ์ด์ง key๋ค์ด ์ผ์ ํ ํจํด์ ๊ฐ์ง๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
์๋ฅผ ๋ค์ด key๋ค ๊ฐ์ ๊ฐ๊ฒฉ์ด 1์ด ์๋๋ผ 100์ด๋ผ๋ฉด ์ ๋ถ์ ์ฐํ๋ ์ ๋ค์
{kฮธ}, {(k + 100)ฮธ}, {(k + 200)ฮธ} ... ์ด๋ ๊ฒ ์๊ฐํ ์ ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ Fibonacci ratio๋ 0.61803398...์ด๊ณ , ์ฌ๊ธฐ์ 100์ ๊ณฑํ๋ค๋ฉด 0.803398...์์ ์ ์ ์์ต๋๋ค.
์ฆ ์ด์ฒ๋ผ 100๋จ์๋ก ๋ณํ๋ key set์ 0.803398...์ด๋ผ๋ ํฐ ๊ฐ์ ์ํด ์์๊ฐ ๊ฒฐ์ ๋๊ณ , ์ด๋ Bad Break๊ฐ ์ปค์ง ์ํฉ์ ๋๋ค.
๋ ๋ค๋ฅธ ์๋ก 1000000๋จ์๋ก ๋ณํ๋ค๋ฉด 0.9887...์ด๋ผ๋ ํฐ ๊ฐ์ ์ํด ์์๊ฐ ๊ฒฐ์ ๋ฉ๋๋ค.
๊ทธ๋์ ์์ ๊ฐ์ key set์ ๋ํด์๋ Randomํ ๊ฒฐ๊ณผ๋ฅผ ์ ์งํ๊ธฐ ์ํด Fibonacci ratio๋ฅผ ๊ทธ๋๋ก ์ฐ์ง ์๊ณ
0.6161... ๊ณผ ๊ฐ์ด ์ด๋ค ํจํด์ด ์๋๋ผ๋ Bad Break๊ฐ ์ฌํด์ง์ง ์๋ ๊ฐ์ ์ฐ๊ณ ์ ํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ 0.6161... ๊ณผ ๊ฐ์ ๊ฐ์ ์ฌ์ฉํ๋ฉด ABCD, CDAB์ ๊ฐ์ด ์์๋ง ๋ฐ๋ key๋ค์ ๋ํด์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค๋ ํน์ง์ด ์์ต๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ Fibonacci ratio๋งํผ์ ์๋์ง๋ง ์ ์ ํ๊ฒ Bad Break๋ฅผ ํผํ ์ ์๋ ๊ฐ๋ค๋ก ์ฑ ์์๋ ๋ค์๊ณผ ๊ฐ์ ๊ฐ๋ค์ด ์๊ฐ๋์์ต๋๋ค.
1/4 < ฮธ < 3/10, 1/3 < ฮธ < 3/7, 4/7 < ฮธ < 2/3, 7/10 < ฮธ < 3/4
ratio์ ๊ฐ ์๋ฆฌ๋ฅผ ์์ 4๊ฐ์ ๊ตฌ์ญ์์ ๊ณจ๊ณ ๋ฃจ ๋ฝ์์ A๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด 0.61 25 42 33 71 .. ๊ณผ ๊ฐ์ด ๊ฐ ๊ตฌ์ญ์์ ๊ณจ๊ณ ๋ฃจ ๊ฐ์ ๋ฝ์ ํ w * 0.6125423371... = A๋ก ๊ฒฐ์ ํฉ๋๋ค.