Ни один из предоставленных ответов не показался особенно полезным, учитывая вопрос.У меня была та же проблема, мне нужен простой, обратимый хеш для целей, не связанных с безопасностью, и я решил пойти с перемещением битов.Это просто, это быстро и не требует знания чего-либо о булевых математических или криптоалгоритмах или чего-либо еще, что требует реального мышления.
Самым простым будет, вероятно, просто сдвинуть половину бит влево, а другойполовина справа:
def hash(n):
return ((0x0000FFFF & n)<<16) + ((0xFFFF0000 & n)>>16)
Это обратимо, в этом хэше (hash (n)) = n и имеет непоследовательные пары {n, m}, n
Чтобы получить менее последовательную реализацию, вы можете также рассмотреть возможность переупорядочения чередования с [msb, z, ..., a, lsb] на [msb, lsb, z,a, ...] или [lsb, msb, a, z, ...] или любое другое перемещение, которое, по вашему мнению, дает непоследовательную последовательность номеров, с которыми вы имеете дело.
(функция вышебезопасен для чисел, умещающихся в 32 бита, большие числа гарантированно вызывают коллизии, и для предотвращения проблем потребуется больше покрытия битовой маской. При этом 32 бита обычно достаточно для любого пользователя, не связанного с безопасностью).
Также взгляните на мультипликативный обратный ответ, данный Энди Хейденом, ниже.