[go] FNV 해싱 알고리즘의 해시 충돌 처리

FNV 해싱 알고리즘은 해시 테이블에서 키와 값을 매핑하기 위한 빠르고 간단한 해싱 알고리즘입니다. 하지만 모든 해싱 알고리즘과 마찬가지로 해시 충돌이 발생할 수 있습니다. 해시 충돌은 두 개 이상의 다른 키가 같은 해시값을 갖는 상황을 말합니다.

해시 충돌과 그 처리 방법

해시 충돌을 처리하는 여러 가지 방법이 있지만, 가장 기본적인 방법은 해시 테이블의 각 버킷에 연결리스트(Linked List)를 사용하여 충돌을 처리하는 방식입니다.

예를 들어, Go 언어로 구현된 FNV 해싱 알고리즘에서는 다음과 같이 충돌을 해결할 수 있습니다.

type entry struct {
    key   string
    value interface{}
    next  *entry
}

type HashMap struct {
    buckets []*entry
}

func (hm *HashMap) put(key string, value interface{}) {
    index := hash(key) % len(hm.buckets)
    e := hm.buckets[index]
    for e != nil {
        if e.key == key {
            e.value = value
            return
        }
        e = e.next
    }
    newEntry := &entry{key, value, nil}
    newEntry.next = hm.buckets[index]
    hm.buckets[index] = newEntry
}

위의 코드에서는 puts 메서드를 사용하여 충돌을 처리합니다. 같은 해시값을 갖는 엔트리가 있는 경우 연결리스트로 처리하여 새로운 엔트리를 추가합니다.

결론

FNV 해싱 알고리즘은 빠르고 간단하지만 해시 충돌에 대비하여 충분한 대책이 필요합니다. 연결리스트를 사용하는 방법은 가장 일반적인 방법 중 하나이며 해시 테이블의 버킷 크기를 조절하여 충돌을 줄이는 것도 중요합니다.

해시 충돌 처리 방법에는 여러가지가 있으며 실제 사용하는 환경과 상황에 따라 적절한 방법을 선택해야 합니다.

이상으로 FNV 해싱 알고리즘의 해시 충돌에 대한 처리 방법에 대해 알아보았습니다.

출처 및 참고자료