import string
HASH_MAX = 32
def hash(s):
return sum(map(ord,s)) % HASH_MAX
class LinkedNode:
def __init__(self, key, values):
self.key = key
self.values = values
self.next_node = None
def table_insert(table, key, **values):
head = table[hash(key)]
if head is None:
hash_table[hash(key)] = LinkedNode(key, values)
else:
while head.next_node is not None:
head = head.next_node
head.next_node = LinkedNode(key, values)
def table_lookup(table, key):
head = hash_table[hash(key)]
if head is None:
return "Hash failure!"
elif head.next_node is None:
return head.values
else:
while head is not None and head.key != key:
head = head.next_node
return head.values if head is not None else "Hash failure!"
hash_table = [None for _ in range(HASH_MAX)]
table_insert(hash_table, 'abc', name='foo', age=11)
table_insert(hash_table, 'def', name='bar', age=34)
table_insert(hash_table, 'cba', name='baz', age=2357)
print(table_lookup(hash_table, 'abc'))
print(table_lookup(hash_table, 'def'))
print(table_lookup(hash_table, 'cba'))
print(table_lookup(hash_table, 'abcd'))
aW1wb3J0IHN0cmluZwoKSEFTSF9NQVggPSAzMgoKZGVmIGhhc2gocyk6CglyZXR1cm4gc3VtKG1hcChvcmQscykpICUgSEFTSF9NQVgKCmNsYXNzIExpbmtlZE5vZGU6CglkZWYgX19pbml0X18oc2VsZiwga2V5LCB2YWx1ZXMpOgoJCXNlbGYua2V5ID0ga2V5CgkJc2VsZi52YWx1ZXMgPSB2YWx1ZXMKCQlzZWxmLm5leHRfbm9kZSA9IE5vbmUKCmRlZiB0YWJsZV9pbnNlcnQodGFibGUsIGtleSwgKip2YWx1ZXMpOgoJaGVhZCA9IHRhYmxlW2hhc2goa2V5KV0KCWlmIGhlYWQgaXMgTm9uZToKCQloYXNoX3RhYmxlW2hhc2goa2V5KV0gPSBMaW5rZWROb2RlKGtleSwgdmFsdWVzKQoJZWxzZToKCQl3aGlsZSBoZWFkLm5leHRfbm9kZSBpcyBub3QgTm9uZToKCQkJaGVhZCA9IGhlYWQubmV4dF9ub2RlCgkJaGVhZC5uZXh0X25vZGUgPSBMaW5rZWROb2RlKGtleSwgdmFsdWVzKQoKZGVmIHRhYmxlX2xvb2t1cCh0YWJsZSwga2V5KToKCWhlYWQgPSBoYXNoX3RhYmxlW2hhc2goa2V5KV0KCWlmIGhlYWQgaXMgTm9uZToKCQlyZXR1cm4gIkhhc2ggZmFpbHVyZSEiCgllbGlmIGhlYWQubmV4dF9ub2RlIGlzIE5vbmU6CgkJcmV0dXJuIGhlYWQudmFsdWVzCgllbHNlOgoJCXdoaWxlIGhlYWQgaXMgbm90IE5vbmUgYW5kIGhlYWQua2V5ICE9IGtleToKCQkJaGVhZCA9IGhlYWQubmV4dF9ub2RlCgkJcmV0dXJuIGhlYWQudmFsdWVzIGlmIGhlYWQgaXMgbm90IE5vbmUgZWxzZSAiSGFzaCBmYWlsdXJlISIKCQkKaGFzaF90YWJsZSA9IFtOb25lIGZvciBfIGluIHJhbmdlKEhBU0hfTUFYKV0KCnRhYmxlX2luc2VydChoYXNoX3RhYmxlLCAnYWJjJywgbmFtZT0nZm9vJywgYWdlPTExKQp0YWJsZV9pbnNlcnQoaGFzaF90YWJsZSwgJ2RlZicsIG5hbWU9J2JhcicsIGFnZT0zNCkKdGFibGVfaW5zZXJ0KGhhc2hfdGFibGUsICdjYmEnLCBuYW1lPSdiYXonLCBhZ2U9MjM1NykKCnByaW50KHRhYmxlX2xvb2t1cChoYXNoX3RhYmxlLCAnYWJjJykpCnByaW50KHRhYmxlX2xvb2t1cChoYXNoX3RhYmxlLCAnZGVmJykpCnByaW50KHRhYmxlX2xvb2t1cChoYXNoX3RhYmxlLCAnY2JhJykpCnByaW50KHRhYmxlX2xvb2t1cChoYXNoX3RhYmxlLCAnYWJjZCcpKQo=