: Hash Table: 키(Key)에 데이터(Value)를 저장하는 데이터 구조
: 한 개 이상의 데이터가 동일한 해쉬 주소에 저장되어야 할 경우 발생하는 문제
hash_table = list([0 for i in range(8)])
def get_key(data):
return hash(data)
def hash_function(key):
return key % 8
def save_data(data, value):
index_key = get_key(data)
hash_address = hash_function(index_key)
if hash_table[hash_address] != 0:
# 같은 해시에 몇 개의 데이터가 들어있는지 확인
for index in range(len(hash_table[hash_address])):
if hash_table[hash_address][index][0] == index_key:
hash_table[hash_address][index][1] = value
return
hash_table[hash_address].append([index_key, value])
else:
hash_table[hash_address] = [[index_key, value]]
def read_data(data):
index_key = get_key(data)
hash_address = hash_function(index_key)
if hash_table[hash_address] != 0:
for index in range(len(hash_table[hash_address])):
if hash_table[hash_address][index][0] == index_key:
return hash_table[hash_address][index][1]
else:
return None
print(hash('Dave') % 8)
print(hash('Dd') % 8)
print(hash('Data') % 8)
save_data('Dd', '12341234')
save_data('Data', '00000000')
read_data('Dd')
hash_table = list([0 for i in range(8)])
def get_key(data):
return hash(data)
def hash_function(key):
return key % 8
def save_data(data, value):
index_key = get_key(data)
hash_address = hash_function(index_key)
if hash_table[hash_address] != 0:
# 같은 해시에 몇 개의 데이터가 들어있는지 확인
for index in range(len(hash_table[hash_address])):
if hash_table[hash_address][index][0] == index_key:
hash_table[hash_address][index][1] = value
return
hash_table[hash_address].append([index_key, value])
else:
hash_table[hash_address] = [[index_key, value]]
def read_data(data):
index_key = get_key(data)
hash_address = hash_function(index_key)
if hash_table[hash_address] != 0:
for index in range(len(hash_table[hash_address])):
if hash_table[hash_address][index][0] == index_key:
return hash_table[hash_address][index][1]
else:
return None
print(hash('Dave') % 8)
print(hash('Dd') % 8)
print(hash('Data') % 8)
save_data('Dd', '12341234')
save_data('Data', '00000000')
read_data('Dd')
: 폐쇄 해싱 또는 Close Hashing 기법중 하나: 해쉬 테이블 저장공간 안에서 충돌 문제를 해결하는 기법
: 충돌이 일어나면, 해당 hash address의 다음 address부터 맨 처음 나오는 빈 공간에 저장하는 기법 (저장공간 활용도를 높일 수 있음)
hash_table = list([0 for i in range(8)])
def get_key(data):
return hash(data)
def hash_function(key):
return key % 8
def save_data(data, value):
index_key = get_key(data)
hash_address = hash_function(index_key)
if hash_table[hash_address] != 0:
for index in range(hash_address, len(hash_table)):
if hash_table[index] == 0:
hash_table[index] = [index_key, value]
return
# 같은 해쉬값에 같은 키를 가진 경우 => 데이터만 업데이트
elif hash_table[index][0] == index_key:
hash_table[index][1] = value
return
else:
hash_table[hash_address] = [index_key, value]
def read_data(data):
index_key = get_key(data)
hash_address = hash_function(index_key)
if hash_table[hash_address] != 0:
for index in range(hash_address, len(hash_table)):
if hash_table[index] == 0:
return None
elif hash_table[index][0] == index_key:
return hash_table[index][1]
else:
return None
print(hash('dk') % 8)
print(hash('da') % 8)
save_data('dk', '010ddddkkkkk')
save_data('da', '010ddddaaaaa')
read_data('da')