На некоторых платформах (например, встроенных) операция по модулю обходится дорого, поэтому лучше избегать % 13
.Но AND
операция с битами младших разрядов обходится дешево и эквивалентна модулю степени 2.
Я попытался написать простую программу (на Python) для поиска идеального хэша ваших 11точки данных, используя простые формы, такие как ((x << a) ^ (x << b)) & 0xF
(где & 0xF
эквивалентно % 16
, что дает результат в диапазоне 0..15, например).Мне удалось найти следующий хеш без столкновений, который дает индекс в диапазоне 0..15 (выраженный в виде макроса C):
#define HASH(x) ((((x) << 2) ^ ((x) >> 2)) & 0xF)
Вот программа Python, которую я использовал:
data = [ 10, 100, 32, 45, 58, 126, 3, 29, 200, 400, 0 ]
def shift_right(value, shift_value):
"""Shift right that allows for negative values, which shift left
(Python shift operator doesn't allow negative shift values)"""
if shift_value == None:
return 0
if shift_value < 0:
return value << (-shift_value)
else:
return value >> shift_value
def find_hash():
def hashf(val, i, j = None, k = None):
return (shift_right(val, i) ^ shift_right(val, j) ^ shift_right(val, k)) & 0xF
for i in xrange(-7, 8):
for j in xrange(i, 8):
#for k in xrange(j, 8):
#j = None
k = None
outputs = set()
for val in data:
hash_val = hashf(val, i, j, k)
if hash_val >= 13:
pass
#break
if hash_val in outputs:
break
else:
outputs.add(hash_val)
else:
print i, j, k, outputs
if __name__ == '__main__':
find_hash()