Lee → 해싱함수 → 5
Kim → 해싱함수 → 3
Park → 해싱함수 → 2
...
Chun → 해싱함수 → 5 // Lee와 해싱값 충돌
체이닝(Chaining) : 연결리스트로 노드를 계속 추가해나가는 방식 (제한 없이 계속 연결 가능, but 메모리 문제)
오픈 어드레싱(Open Addressing) : 해시 함수로 얻은 주소가 아닌 다른 주소에 데이터를 저장할 수 있도록 허용 (해당 키 값에 저장되어있으면 다음 주소에 저장)
<해시 테이블>
hash_table = [0 for i in range(8)]
def hash_func(data):
return hash(data) % 8
def set_data(data,value):
key = hash_func(data)
hash_table[key] = value
def get_data(data):
key = hash_func(data)
return hash_table[key]
<체이닝>
hash_table = [0 for i in range(8)]
def hash_func(key):
return key % 8
def set_data(data,value):
hash_idx = hash(data)
hash_key = hash_func(hash_idx)
if hash_table[hash_key] != 0:
for i in range(len(hash_table[hash_key])):
if hash_table[hash_key][i][0] == hash_idx:
hash_table[hash_key][i][1] = value
return True
hash_table[hash_key].append([hash_idx,value])
return True
else:
hash_table[hash_key] = [[hash_idx,value]]
return True
def get_data(data):
hash_idx = hash(data)
hash_key = hash_func(hash_idx)
if hash_table[hash_key]:
for value in hash_table[hash_key]:
if value[0] == hash_idx:
print(value[1])
return value[1]
print("None")
return None
else:
print("None")
return None