可逆的哈希函数?
我需要一个可逆的哈希函数(显然,输入的大小将比输出小得多),该函数将输入以随机的方式映射到输出。基本上,我想要一种将“ 123”之类的数字转换为“
9874362483910978”之类的较大数字的方法,但不是要保留比较的方法,因此,如果x1> x2,f(x1 )> f(x2)(但也不能始终为假)。
这种情况的用例是,我需要找到一种方法将小数字转换成看起来更大的随机数字。它们实际上并不需要是随机的(实际上,它们必须是确定性的,因此相同的输入始终映射到相同的输出),但是它们确实需要
看起来是 随机的(至少当base64编码为字符串时,因此按Z移位)位将不起作用,因为相似的数字将具有相似的MSB)。
另外,简单(快速)的计算和逆转是一个加号,但不是必需的。
我不知道我是否很清楚,或者是否存在这样的算法,但我将不胜感激!
-
鉴于这个问题,提供的答案似乎都没有特别有用。我遇到了同样的问题,出于非安全目的需要一个简单,可逆的哈希,并决定使用位重定位。它简单,快速,并且不需要了解布尔数学或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位通常就足够了)。