可逆的哈希函数?

发布于 2021-01-29 19:08:00

我需要一个可逆的哈希函数(显然,输入的大小将比输出小得多),该函数将输入以随机的方式映射到输出。基本上,我想要一种将“ 123”之类的数字转换为“
9874362483910978”之类的较大数字的方法,但不是要保留比较的方法,因此,如果x1> x2,f(x1 )> f(x2)(但也不能始终为假)。

这种情况的用例是,我需要找到一种方法将小数字转换成看起来更大的随机数字。它们实际上并不需要是随机的(实际上,它们必须是确定性的,因此相同的输入始终映射到相同的输出),但是它们确实需要
看起来是 随机的(至少当base64编码为字符串时,因此按Z移位)位将不起作用,因为相似的数字将具有相似的MSB)。

另外,简单(快速)的计算和逆转是一个加号,但不是必需的。

我不知道我是否很清楚,或者是否存在这样的算法,但我将不胜感激!

关注者
0
被浏览
51
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    鉴于这个问题,提供的答案似乎都没有特别有用。我遇到了同样的问题,出于非安全目的需要一个简单,可逆的哈希,并决定使用位重定位。它简单,快速,并且不需要了解布尔数学或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位通常就足够了)。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看