鉴于这个问题,提供的答案似乎都没有特别有用。我遇到了同样的问题,出于非安全目的需要一个简单,可逆的哈希,并决定使用位重定位。它简单,快速,并且不需要了解布尔数学或crypo算法的任何知识,也不需要了解任何其他需要实际思考的知识。
最简单的方法可能是只向左移动一半,向右移动另一半:
def hash(n): return ((0x0000FFFF & n)<<16) + ((0xFFFF0000 & n)>>16)
这是可逆的,因为hash(hash(n))= n,并且具有非连续对{n,m},n <m,其中hash(m)<hash(n)。
为了获得不太顺序的实现,您可能还需要考虑从[msb,z,…,a,lsb]到[msb,lsb,z,a,…]或[lsb,msb]的隔行排序,a,z,…]或其他任何您认为适合的数字重定位顺序。
(上面的函数对于适合32位的数字是安全的,可以保证较大的数字会导致冲突,并且需要更多的位掩码覆盖以防止出现问题。也就是说,对于任何非安全性uid而言,32位通常就足够了)。



