class HashTable(object):
def __init__(self,size):
self.size = size
self.slots = [None] * self.size
self.data = [None] * self.size
def put(self,key,data):
# get hash value
hashvalue = self.hashfunction(key,len(self.slots))
# if slot is empty
if self.slots[hashvalue] == None:
self.slots[hashvalue] = key
self.data[hashvalue] = data
else:
if self.slots[hashvalue] == key:
self.data[hashvalue] = data
else:
nextslot = self.rehash(hashvalue,len(self.slots))
while self.slots[nextslot] != None and self.slots[hashvalue] != key:
nextslot = self.rehash(nextslot,len(self.slots))
if self.slots[nextslot] == None:
self.slots[nextslot] = key
self.data[nextslot] = data
else:
self.data[nextslot] = data
def hashfunction(self,key,size):
return key % size
def rehash(self,oldhash,size):
return (oldhash + 1) % size
def get(self,key):
data = None
stop = False
found = False
startslot = self.hashfunction(key,len(self.slots))
position = startslot
while (self.slots[position]) != None and (not found) and (not stop):
if self.slots[position] == key:
found = True
data = self.data[position]
else:
position = self.rehash(position,len(self.slots))
if position == startslot:
stop = True
return data
def __getitem__(self,key):
return self.get(key)
def __setitem__(self,key,data):
return self.put(key,data)
解决哈希碰撞可参考 解决hash冲突的三个方法