How to choose a good Hash Function? - minseok127/HashSimulator GitHub Wiki

What is a good Hash Function?

์ข‹์€ Hash Function์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”? ์•„๋งˆ๋„ Hash Table์ด ์ข‹์€ ์„ฑ๋Šฅ์„ ๊ฐ€์ง€๋„๋ก ํ•˜๋Š” ํ•จ์ˆ˜๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด Hash Function์ด ์–ด๋–ป๊ฒŒ Hash Table์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์„๊นŒ์š”?

Time to get Hash code

๋จผ์ € Hash code๋ฅผ ๋„์ถœํ•ด๋‚ด๋Š” ์†๋„๋ฅผ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ Hash Table์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ์ €์žฅ๋˜์–ด ์žˆ๋Š” Data๋กœ ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์—์„œ Hash Function์ด ๋„ˆ๋ฌด ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋ชจํ•œ๋‹ค๋ฉด ์ „์ฒด์ ์ธ Hash Table์˜ ์„ฑ๋Šฅ์— ์•…์˜ํ–ฅ์„ ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Collision

ํ•˜๋‚˜์˜ bin์— ๋„ˆ๋ฌด ๋งŽ์€ Data๋“ค์ด ์ €์žฅ๋œ๋‹ค๋ฉด ์ด ๋˜ํ•œ Hash Table์˜ ์„ฑ๋Šฅ์„ ๋‚ฎ์ถ”๋Š” ์š”์ธ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด 10๊ฐœ์˜ data์™€ 10๊ฐœ์˜ bins๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ 10๊ฐœ์˜ bins์— 1๊ฐœ์”ฉ data๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค๋ฉด, 10๊ฐœ์˜ data ๋ชจ๋‘์— ์ ‘๊ทผํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ํƒ์ƒ‰ ์ˆ˜๋Š” 10์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ 1๊ฐœ์˜ bin์— data 10๊ฐœ๊ฐ€ ๋ชจ๋‘ ๋“ค์–ด์žˆ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

๋งจ ์•ž์— ์žˆ๋Š” data๋Š” 1๋ฒˆ์˜ ํƒ์ƒ‰์œผ๋กœ ๋๋‚˜์ง€๋งŒ ๋‘ ๋ฒˆ์งธ data๋Š” 2๋ฒˆ, ์„ธ ๋ฒˆ์งธ data๋Š” 3๋ฒˆ, ... ์ด 10 * (10 + 1) / 2 = 55 ๋งŒํผ์˜ ํƒ์ƒ‰์ด ํ•„์š”ํ•ด์ง‘๋‹ˆ๋‹ค.

๋“ฑ์ฐจ์ˆ˜์—ด์˜ ํ•ฉ : n * (n + 1) / 2

Uniformity

์œ„์™€ ๊ฐ™์ด Hash Table์˜ Data๋ฅผ ์ข€ ๋” ๋น ๋ฅด๊ฒŒ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ตœ๋Œ€ํ•œ Data๋“ค์„ ์—ฌ๋Ÿฌ bins์— ๊ณจ๊ณ ๋ฃจ ๋ถ„๋ฐฐํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰ Hash Function์˜ ๊ฒฐ๊ณผ๋ฅผ ํ† ๋Œ€๋กœ ์–ป์–ด๋‚ธ Index์˜ ๋ถ„ํฌ๊ฐ€ Uniform Distribution์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ด ์ด์ƒ์ ์ธ ์ƒํ™ฉ์ธ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ƒ๊ฐ์„ ๋ฐ”ํƒ•์œผ๋กœ Good Hash Function์„ ์–ด๋–ป๊ฒŒ ํŒ๋‹จํ•ด๋ณผ ์ˆ˜ ์žˆ์„ ์ง€์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Contents