hashTable이란?

딕셔너리가 해시 테이블로 구현되어 있기 때문에,해시 테이블도 당연히 Key - Value로 값을 저장함 하지만 해시 테이블은 내부적으로 array로 구현이 되어있다.

해당 key를 해시 함수를 통하여 hash하고 결과값인 해시주소값에 해당하는 hashtable 슬롯에 value를 저장하는것.

Untitled

우린 "유"라는 Key만 갖고 해시테이블에 저장된 “값”에 접근해야하는데, 해시테이블은 내부적으로 배열로 되어있다. 배열에서는 “값”에 접근하려면 index 로만 접근이 가능하다. 그럼 key를 통해 해시 테이블의 Index를 알수 있어야만 해당 값에 접근이 가능하겠구나~ 까지 생각해볼것

우린 Value가 저장된 해시 테이블의 index를 모르니까, Key를 통해 index를 알아내야 하는 것임!

이때 해당 Key에 상응하는 index는 항상 동일하게 나와야 꼬이지 않잖음??

이것을 해주는 것이 바로 해시 함수 라는 것임!

Key에 대한 산술 연산을 이용하여 해시 주소값(해시테이블의 Index)으로 만들어 주는것!

즉, 해시 테이블이란 것은,

Key라는 것을 해시 함수를 이용해 **해시 주소값(해시 테이블의 index)**으로 바꾸고,

해시 주소값(해시 테이블의 index)를 통해 해시 테이블에 접근하여 값을 가져오거나 저장하는 형태

//해시함수 만들기

var hashTable: [String?] = .init(repeating: nil, count: 3)

func hash(key: Int) -> Int {
    return key % 3
}

//해시 테이블에 저장하는 함수 만들기

func updateValue(_ value: String, forkey key: String) {
    guard let key = UnicodeScalar(key)?.value else { return }
    let hashAddress = hash(key: Int(key))
    hashTable[hashAddress] = value
}

//해시 테이블의 값을 얻는 함수 만들기

func getValue(forKey key:String) -> String? {
    guard let key = UnicodeScalar(key)?.value else { return nil }
    let hashAddress = hash(key: Int(key))
    return hashTable[hashAddress]
}

updateValue("재석", forkey: "유")
updateValue("명수", forkey: "박")

getValue(forKey: "유")
getValue(forKey: "소들")

해시 테이블의 충돌

(Key는 다르지만, 해시 함수가 단순해서 결과값인 해시 주소값이 겹치는 문제) 만약 이 경우, Key - Value가 덮어씌어지는 충돌 현상이 발생함..! 이를 해결하기 위해 2가지 방법이 있음