当前位置: 首页 > 面试题库 >

可逆的哈希函数?

南宫兴德
2023-03-14
问题内容

我需要一个可逆的哈希函数(显然,输入的大小将比输出小得多),该函数将输入以随机的方式映射到输出。基本上,我想要一种将“ 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位通常就足够了)。



 类似资料:
  • 问题内容: 在如何哈希列表?有人告诉我,我应该转换为一个元组第一,如到。 因此,第一个不能散列,而第二个可以散列。为什么*? *我并不是真正地在寻求详细的技术说明,而是在寻找一种直觉 问题答案: 主要是因为元组是不可变的。承担以下工作: 现在,当您这样做时会发生什么?您已修改字典中的键!远道而来!如果您熟悉哈希算法的工作原理,这会让您感到恐惧。另一方面,元组是绝对不变的。看起来好像是在修改元组,但

  • 我正在尝试编写一个C程序,使用哈希表来存储不同的单词,我需要一些帮助。 首先,我创建一个哈希表,其大小为最接近我必须存储的单词数的素数,然后我使用一个哈希函数为每个单词找到一个地址。我从最简单的函数开始,把字母加在一起,结果有88%的碰撞。然后我开始实验这个函数,发现无论我把它改成什么,碰撞都不会低于35%。现在我在用 这只是我想出来的一个随机函数,但它给了我最好的结果--大约35%的碰撞。 在过

  • 我正在使用Google Maps API,觉得除了大量的语句之外,还有一种更好的方法来搜索全景图像。我认为使用外部哈希表会更有效,更容易维护。每个图像都有一个唯一的,我可以定义它。阅读哈希表,我相信我的说法是正确的,我可以做一个表和完善的函数,以获得我需要的数据,在恒定的时间。有没有一个很好的资源如何构建这个?我对哈希一点经验都没有。 我的逻辑是这样的:每个图像都以的形式保存在一个目录中,其中是一

  • 主要内容:SHA-256哈希函数接受任意长度的输入字符串(数字,字母,媒体文件)并将其转换为固定长度。固定位长度可以变化(如32位或64位或128位或256位),具体取决于所使用的散列函数。固定长度输出称为散列。此哈希也是哈希算法的加密副产品。这如下所示。 哈希算法具有以下特性: 它产生一个唯一的输出(或哈希)。 它是一个单向的函数。 在像比特币这样的加密货币的情况中,区块链在其共识机制中使用这种加密哈希函数的属性。加密

  • 我正在我想要存储字符串的哈希程序中使用DJB2哈希函数。但是这个哈希函数返回一个非常大的无符号int值作为返回值(哈希表索引)。如果我的表大小很小(比如说13),有没有办法把这个大值转换成更小的。我只想尽可能避免碰撞。 DJB2哈希函数代码如下:

  • keys 一个包含哈希表中查找到的键的序列。 请注意,并不是所有的哈希表都支持这个 (询问程序员一个指定的哈希表是否允许这么操作)。 <#assign h = {"name":"mouse", "price":50}> <#assign keys = h?keys> <#list keys as key>${key} = ${h[key]}; </#list> 将会输出: name = mouse