1. 해쉬 구조
2. 용어
# 예제 문제
# 8개의 hashTable을 생성했다
hash_table = list([0 for i in range(8)])
# key를 만드는 함수인데 hash라는 함수를 써서 구함
def get_key(data):
return hash(data)
# key를 받아서 8로 나눈 나머지 값을 return
def hash_fucntion(key):
return key % 8
# data의 value를 저장하는 함수
def save_data(data,value):
hash_address = hash_fucntion(get_key(data)) # hash를 위에 만든 함수들을 거쳐 hash_address 에 넣는다
hash_table[hash_address] = value # value를 지정함
# value를 읽는 함수
def read_data(data):
hash_address = hash_fucntion(get_key(data))
return hash_table[hash_address]
save_data('Dave','01021283829')
save_data('kkkk','01031243567')
print(read_data('Dave'))
01021283829
3. 자료구조 해쉬 테이블의 장/ 단점
장점
단점
용도
4. 충동을 해결하는 알고리즘
open hashing 기법
hash_table = list([0 for i in range(8)])
def get_key(data):
return hash(data)
def hash_fucntion(key):
return key % 8
def save_data(data,value):
index_key = get_key(data)
hash_address = hash_fucntion(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_fucntion(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]
return None
save_data('Dd','01021283829')
save_data('David','01031243567')
print(hash_table)
print(read_data('Dd'))
Linear Probing 기법
hash_table = list([0 for i in range(8)])
def get_key(data):
return hash(data)
def hash_fucntion(key):
return key % 8
def save_data(data,value):
index_key = get_key(data)
hash_address = hash_fucntion(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, value]
elif hash_table[index][0] == index_key:
hash_table[index][1] = value
return
else:
hash_table[hash_address] = [index, value]
def read_data(data):
index_key = get_key(data)
hash_address = hash_fucntion(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
빈번한 충돌을 개선하는 방법
해쉬 함수를 재정의 및 해쉬 테이블 저장공간을 확대 / 만약에 8 개 저장하려면 16개 이상으로 만든다.
유명한 해쉬 함수들이 있음: SHA , SHA-256
import hashlib
data = 'test'.encode()
hash_object = hashlib.sha1()
hash_object.update(data)
hex_dig = hash_object.hexdigest()
print(hex_dig)