Для того чтобы организовать быстрый доступ к значению массива по ключу за время O(1) нужно ключ побайтово преобразовать в индекс массива и чтобы он не выходил за пределы массива.
Хэширование ведь именно в этом заключается?
Если да, то с этим легко справился:
mass = [None] * 15
def to_hash(x):
res = [bin(ord(i)) for i in x]
res = ''.join([i[2:] for i in res])
x = int(res, 2) % len(mass)
return x
print(to_hash('Василий')) # 1
print(to_hash('Прокопий')) # 13
print(to_hash('Виниамин')) # 14
print(to_hash('Евстигней')) # 11
Но дальнейшая задача сложнее... Нужно избегать возникновения "коллизий", то есть повторяющихся индексов. Например George и Joe дадут одинаковый хэш 1.Для этого существует с десяток математических формул.
Но вообще есть вот такая функция. Он бегает по массиву по кругу и выводит элементы, соответственно будет показывать какой индекс занят, какой свободен (содержит None).
Её тут можно привинтить к решению этого нелегкого дела? Или там всё только строго по давно придуманным для этого формулам?
Насколько помню там и есть подобный алгоритм. Индекс занят - увеличиваем хэш на 1 и двигаемся дальше пока не найдем None
mass = [None] * 15
head = 0
def get_head():
global head
head = (head + 1) % len(mass)
return mass[head - 1]
for i in range(len(mass)):
print(get_head())