λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μ•Œκ³ λ¦¬μ¦˜

13-3. ν•΄μŠ 3

by devshin.kr 2020. 11. 29.
728x90

쒋은 해쉬 ν•¨μˆ˜λž€?

- ν˜„μ‹€μ—μ„œλŠ” 킀듀이 λžœλ€ν•˜μ§€ μ•ŠμŒ

- λ§Œμ•½ ν‚€λ“€μ˜ 톡계적 뢄포에 λŒ€ν•΄ μ•Œκ³  μžˆλ‹€λ©΄ 이λ₯Ό μ΄μš©ν•΄μ„œ 해쉬 ν•¨μˆ˜λ₯Ό κ³ μ•ˆν•˜λŠ” 것이 κ°€λŠ₯ν•˜κ² μ§€λ§Œ ν˜„μ‹€μ μœΌλ‘œ 어렀움

- 킀듀이 μ–΄λ–€ νŠΉμ •ν•œ (κ°€μ‹œμ μΈ) νŒ¨ν„΄μ„ 가지더라도 ν•΄μ‰¬ν•¨μˆ˜κ°’μ΄ λΆˆκ·œμΉ™μ μ΄ λ˜λ„λ‘ ν•˜λŠ” 게 λ°”λžŒμ§

- ν•΄μ‰¬ν•¨μˆ˜ 값이 ν‚€μ˜ νŠΉμ • 뢀뢄에 μ˜ν•΄μ„œλ§Œ κ²°μ •λ˜μ§€ μ•Šμ•„μ•Ό..

 

Division 기법

- h(k) = k mod m

- 예 :  m = 20 and k = 91 -> h(k) = 11

- μž₯점 : ν•œ 번의 mod μ—°μ‚°μœΌλ‘œ 계산. λ”°λΌμ„œ 빠름.

- 단점 : μ–΄λ–€ m값에 λŒ€ν•΄μ„œλŠ” 해쉬 ν•¨μˆ˜κ°’μ΄ ν‚€κ°’μ˜ νŠΉμ • 뢀뢄에 μ˜ν•΄μ„œ κ²°μ •λ˜λŠ” κ²½μš°κ°€ 있음.

         κ°€λ Ή m = 2^p이면 ν‚€μ˜ ν•˜μœ„ pλΉ„νŠΈκ°€ ν•΄μ‰¬ν•¨μˆ˜ 값이 됨.

 

Multiplication 기법

- 0μ—μ„œ 1 μ‚¬μ΄μ˜ μƒμˆ˜ Aλ₯Ό 선택 : 0 < A < 1

- kA의 μ†Œμˆ˜λΆ€λΆ„λ§Œμ„ νƒν•œλ‹€. (μ •μˆ˜λŠ” μ•ˆ 씀)

- μ†Œμˆ˜ 뢀뢄에 m을 κ³±ν•œ 수 μ†Œμˆ˜μ  μ•„λž˜λ₯Ό 버린닀.

 

 

Hash code in Java

- Java의 Object ν΄λž˜μŠ€λŠ” hashCode() λ©”μ„œλ“œλ₯Ό 가짐. λ”°λΌμ„œ λͺ¨λ“  ν΄λž˜μŠ€λŠ” hashCode() λ©”μ„œλ“œλ₯Ό 상속 λ°›λŠ”λ‹€. 이 λ©”μ„œλ“œλŠ” ν•˜λ‚˜μ˜ 32λΉ„νŠΈ μ •μˆ˜λ₯Ό λ°˜ν™˜ν•œλ‹€.

- λ§Œμ•½ x.equals(y)이면, x.hashCode() == y.hashCode()이닀. ν•˜μ§€λ§Œ 역은 μ„±λ¦½ν•˜μ§€ μ•ŠλŠ”λ‹€.

- Object 클래슀의 hashCode() λ©”μ„œλ“œλŠ” 객체의 λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό λ°˜ν™˜ν•˜λŠ” κ²ƒμœΌλ‘œ μ•Œλ €μ Έ 있음 (but its implementation-dependent)

- ν•„μš”μ— 따라 각 ν΄λž˜μŠ€λ§ˆλ‹€ 이 λ©”μ„œλ“œλ₯Ό overrideν•˜μ—¬ μ‚¬μš©ν•œλ‹€.

   - 예) Integer ν΄λž˜μŠ€λŠ” μ •μˆ˜κ°’μ„ hashCode둜 μ‚¬μš©...

 

// 해쉬 ν•¨μˆ˜μ˜ 예 : hashCode() for Strings in Java
public final class String
{
	private final char[] s;
    ...
    public int hashCode()
    {
    	int hash = 0;
        for (int i = 0; i < length(); i++)
        	hash = s[i] + (31 * hash);
        return hash;
    }
}

 

 

piblic class Record
{
	private String name;
    private int id;
    private double value;
    ...
    
	// λ‚΄κ°€ μ›ν•˜λŠ” hash ν•¨μˆ˜λ₯Ό μž‘μ„±ν•œλ‹€.
    public int hashCode()
    {
    	int hash = 17;	// nonzero constant
        hash = 31 * hash + name.hashCode();
        hash = 31 * hash + Integer.valueOf(id).hashCode();
        hash = 31 * hash + Double.valueOf(value).hashCode();
        return hash;
    }

}

 

 

 

hashCodeκ³Ό hashν•¨μˆ˜

- hashCode : -21^31μ—μ„œ 2^31 μ‚¬μ΄μ˜ μ •μˆ˜

- hash ν•¨μˆ˜ : 0μ—μ„œ M-1κΉŒμ§€μ˜ μ •μˆ˜.. (λ°°μ—΄ 인덱슀)

// hashCodeλ₯Ό hash ν•¨μˆ˜λ‘œ λ§Œλ“€κΈ°

private int hash (Key key) {

    return (key.hashCode() & 0x7fffffff) % M;

}

 

 

Javaμ—μ„œλŠ” HashMapκ³Ό HashSet이 μžˆλ‹€.

C++μ—μ„œλŠ” #include <unordered_set>이 μžˆλ‹€. (μžλ°”μ˜ HashMap에 λŒ€μ‘..)

λŒ“κΈ€