ํ•ด์‹œ Hash

๐Ÿฅ”๊น€๊ฐ์ž๐Ÿฅ”ยท2022๋…„ 11์›” 27์ผ

๐Ÿ’ก ํ•ด์‹œํ•จ์ˆ˜๋ž€?

ํ•ด์‹œํ•จ์ˆ˜๋Š” key๋ฅผ ๊ณ ์ •๋œ ๊ธธ์ด์˜ hash๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ, ์ด ๊ณผ์ •์„ Hashing์ด๋ผ๊ณ  ํ•œ๋‹ค.
์ด ํ•ด์‹œํ•จ์ˆ˜์— key๊ฐ’์„ input์œผ๋กœ ๋„ฃ์œผ๋ฉด output์œผ๋กœ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ Hash์ด๋ฉฐ, ์ด ํ•ด์‹œ๊ฐ€ ์ €์žฅ ์œ„์น˜๊ฐ€ ๋œ๋‹ค.
์ฆ‰, ํ•ด์‹œ ํ•จ์ˆ˜๋Š” key๋กœ ํ•ด์‹œ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ํ•จ์ˆ˜์ด๋‹ค.

๐Ÿ’ก ํ•ด์‹œํ…Œ์ด๋ธ” ๊ตฌ์„ฑ

1. Key

๊ณ ์œ ํ•œ ๊ฐ’, hash function์˜ Input์ด๋‹ค.
key๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์ €์žฅ์†Œ์˜ ์ƒ‰์ธ์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ key์˜ ๊ธธ์ด๋งŒํผ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ๊ณต๊ฐ„๋„ ๋”ฐ๋กœ ๋งˆ๋ จํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— key์˜ ๊ธธ์ด๊ฐ€ ์ œ๊ฐ๊ฐ์ผ ์ˆ˜ ์žˆ๋‹ค. ๋•Œ๋ฌธ์— ๊ณ ์ •๋œ ๊ธธ์ด์˜ ํ•ด์‹œ๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.

2. Hash Function

Key๋ฅผ ๊ณ ์ •๋œ ๊ธธ์ด์˜ Hash๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” ์—ญํ• 
์„œ๋กœ ๋‹ค๋ฅธ key๊ฐ€ hashing ํ›„ ๊ฐ™์€ hash๊ฐ’์ด ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ๋ฅผ ํ•ด์‹œ ์ถฉ๋Œ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ด๋Ÿฐ ํ•ด์‹œ ์ถฉ๋Œ์˜ ๋ฐœ์ƒ ํ™•๋ฅ ์ด ์ ์„ ์ˆ˜๋ก ์ข‹๋‹ค.
๋˜ํ•œ ํ•ด์‹œ ์ถฉ๋Œ์ด ๊ท ๋“ฑํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜๋‹ค. ๋ชจ๋“  ํ‚ค๊ฐ€ ๊ฐ™์€ ํ•ด์‹œ๊ฐ’์ด ๋‚˜์˜ค๊ฒŒ ๋˜๋ฉด, ๋ฐ์ดํ„ฐ ์ €์žฅ ์‹œ ๋น„ํšจ์œจ์„ฑ์ด ์ปค์ง€๊ณ  ๋ณด์•ˆ์ด ์ทจ์•ฝํ•ด์ ธ์„œ ์ข‹์ง€ ์•Š๋‹ค.

3. Value

์ €์žฅ์†Œ(๋ฒ„ํ‚ท, ์Šฌ๋กฏ)์— ์ตœ์ข…์ ์œผ๋กœ ์ €์žฅ๋˜๋Š” ๊ฐ’์œผ๋กœ, hash์™€ ๋งค์นญ๋˜์–ด ์ €์žฅ๋œ๋‹ค.

4. Hash Table

ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‚ค๋ฅผ ํ•ด์‹œ ๊ฐ’์œผ๋กœ ๋งคํ•‘ํ•˜๊ณ , ์ด ํ•ด์‹œ ๊ฐ’์„ ์ฃผ์†Œ ๋˜๋Š” ์ƒ‰์ธ ์‚ผ์•„ ๋ฐ์ดํ„ฐ(Value)๋ฅผ Key์™€ ํ•จ๊ป˜ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ

๐Ÿ’ก ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋Šฅ

  • ๋ฐ์ดํ„ฐ ์‚ฝ์ž…(์ €์žฅ)

๋จผ์ € ๋ฐ์ดํ„ฐ๋ฅผ Hash Function์„ ์ด์šฉํ•˜์—ฌ key ๊ฐ’์„ hash๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.
์ดํ›„ ๋ฏธ๋ฆฌ ์ค€๋น„ํ•ด๋‘” ์ €์žฅ์†Œ(bucket, slot) ์ค‘์— ์•Œ๋งž์€ hash ๊ฐ’์„ ์ฐพ์•„ value๋ฅผ ์ €์žฅํ•œ๋‹ค.
๋”ฐ๋ผ์„œ ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ ์‚ฝ์ž…(์ €์žฅ)๊ณผ์ •์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(1)์ด๋‹ค.

  • ๋ฐ์ดํ„ฐ ์‚ญ์ œ

์ €์žฅ๋œ ๊ฐ’์„ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” bucket์— ์‚ญ์ œํ•  key์™€ ๋งค์นญ๋˜๋Š” value ๊ฐ’์„ ์ฐพ์•„์„œ ์‚ญ์ œํ•œ๋‹ค.
๋”ฐ๋ผ์„œ ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ ์‚ญ์ œ ๊ณผ์ •์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(1)์ด๋‹ค.

  • ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰

key๋ฅผ ์ด์šฉํ•ด value๋ฅผ ์ฐพ์•„๋‚ด๋Š” ๊ณผ์ •์ด๋‹ค. key๊ฐ’๊ณผ HashFunction์„ ์ด์šฉํ•ด hash๋ฅผ ์ฐพ๊ณ , ์ด hash๋กœ value๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.
ํ•ด์‹œ ์ถฉ๋Œ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฐ€์ • ํ•˜์— ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(1)์ด๋‹ค.

๐Ÿ’ก ์žฅ์ 

ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ key - value๊ฐ€ 1:1๋กœ ๋งคํ•‘๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฝ์ž…, ์‚ญ์ œ, ๊ฒ€์ƒ‰์˜ ๊ณผ์ •์—์„œ ๋ชจ๋‘ ํ‰๊ท ์ ์œผ๋กœ O(1)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๐Ÿ’ก ๋‹จ์ 

1. ํ•ด์‹œ ์ถฉ๋Œ ๋ฐœ์ƒ

ํ•ด์‹œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐฉ ์ฃผ์†Œ๋ฒ•, ์ฒด์ด๋‹๊ณผ ๊ฐ™์€ ๊ธฐ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค.

2. ์ˆœ์„œ/๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๋ฐฐ์—ด์—๋Š” ์–ด์šธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.

3. ๊ณต๊ฐ„ ํšจ์œจ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.

๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๊ธฐ ์ „์— ๋ฏธ๋ฆฌ ์ €์žฅ ๊ณต๊ฐ„์„ ๋งŒ๋“ค์–ด๋†”์•ผํ•ด์„œ ๋งŒ๋“ค์–ด๋‘” ๊ณต๊ฐ„์ด ๋‹ค ์ฐจ์ง€ ์•Š์•˜์„ ๋•Œ๋Š” ํšจ์œจ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.

4. Hash Function์˜ ์˜์กด๋„๊ฐ€ ๋†’๋‹ค.

ํ•ด์‹œ ํ•จ์ˆ˜๊ฐ€ ๋ณต์žกํ•˜๋ฉด hash๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ์— ๊ธด ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.


๐Ÿ’ก ํ•ด์‹œ ์ถฉ๋Œ(Hash Collision)

A์™€ B๋ฅผ Hash Function์œผ๋กœ ํ•ด์‹œ ๊ฐ’์„ ์–ป์—ˆ๋Š”๋ฐ, ๊ฐ’์ด ๋˜‘๊ฐ™์„ ๊ฒฝ์šฐ

๐Ÿ’ก ํ•ด์‹œ ์ถฉ๋Œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

1. Chaining

์ €์žฅ์†Œ(Bucket)์—์„œ ์ถฉ๋Œ์ด ์ผ์–ด๋‚˜๋ฉด ๊ธฐ์กด ๊ฐ’๊ณผ ์ƒˆ๋กœ์šด ๊ฐ’์„ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•

์žฅ์ 

์ถฉ๋Œ์„ ๋Œ€๋น„ํ•˜์—ฌ ๋ฏธ๋ฆฌ ๊ณต๊ฐ„์„ ๋งŽ์ด ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ถฉ๋Œ์ด ์ƒ๊ธฐ๋ฉด ๊ทธ ๋•Œ ๊ณต๊ฐ„์„ ๋งŒ๋“ค์–ด์„œ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ํ˜•์‹.

๋‹จ์ 

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ™์€ hash์— ์ž๋ฃŒ๋“ค์ด ๋งŽ์ด ์—ฐ๊ฒฐ๋˜๋ฉด ๊ฒ€์ƒ‰ ์‹œ ํšจ์œจ์ด ๋‚ฎ์•„์ง„๋‹ค.

2. Open Addressing(๊ฐœ๋ฐฉ ์ฃผ์†Œ๋ฒ•)

์ถฉ๋Œ์ด ์ผ์–ด๋‚˜๋ฉด ๋น„์–ด์žˆ๋Š” hash์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•
๊ฐœ๋ฐฉ ์ฃผ์†Œ๋ฒ•์˜ ํ•ด์‹œํ…Œ์ด๋ธ”์€ hash์™€ value๊ฐ€ 1:1 ๊ด€๊ณ„๋ฅผ ์œ ์ง€ํ•œ๋‹ค.


์œ„์™€ ๊ฐ™์€ ์˜ˆ์‹œ์—์„œ John๊ณผ Sandra์˜ ํ•ด์‹œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๊ณ , ์‚ฐ๋“œ๋ผ๊ฐ€ ๋น„์–ด์žˆ๋Š” 153 hash์— ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค. ์ดํ›„ Ted๊ฐ€ 153๋ฒˆ hash์— ์ €์žฅ์„ ํ•˜๋ ค๊ณ  ๋ดค๋”๋‹ˆ ์ด๋ฏธ ์‚ฐ๋“œ๋ผ๊ฐ€ ์ €์žฅ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ ๋ฒˆํ˜ธ์ธ 154๋ฒˆ์— ์ €์žฅํ•œ๋‹ค.

๐Ÿ’ก ๋น„์–ด์žˆ๋Š” Hash๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ๋ฐฉ๋ฒ•

1. ์„ ํ˜• ํƒ์ƒ‰

ํ•ด์‹œ ๊ฐ’์—์„œ ๊ณ ์ •๊ฐ’ ๋งŒํผ ๊ฑด๋„ˆ๋›ฐ๋ฉด์„œ ๋น„์–ด์žˆ๋Š” ํ•ด์‹œ๊ฐ€ ๋‚˜์˜ค๋ฉด ์ €์žฅํ•œ๋‹ค.
์ด ๋ฐฉ๋ฒ•์€ ํŠน์ • ํ•ด์‹œ ๊ฐ’ ์ฃผ๋ณ€ ๋ฒ„ํ‚ท์ด ๋ชจ๋‘ ์ฑ„์›Œ์ ธ์žˆ๋Š” primary clustring ๋ฌธ์ œ์— ์ทจ์•ฝํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

2. ์ œ๊ณฑ ํƒ์ƒ‰

๊ณ ์ •๊ฐ’์ด ์•„๋‹Œ 1์นธ -> 4์นธ -> 9์นธ -> 16์นธ ... ์ฒ˜๋Ÿผ ์ œ๊ณฑ์ˆ˜๋งŒํผ ๊ฑด๋„ˆ ๋›ฐ๋ฉด์„œ ๋นˆ ์นธ์„ ์ฐพ๋Š”๋‹ค.
์ด ๋ฐฉ๋ฒ•์€ ๊ณต๊ฐ„์„ ๋งŽ์ด ํ™•๋ณดํ•ด์•ผํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

profile
๊ฐ์ž๋ฅผ ์บ์ž ๊ฐ์ž๋ฅผ ์บ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€