Algorithm 将32位整数转换为36位整数的单向散列(无冲突)?
我想使用单向散列算法(无冲突)将32位整数转换为36位整数 有人能解释一下怎么做吗?“单向”的意思是,很难弄清楚x给出了散列结果h(x)。由于术语“硬”没有明确定义,因此也没有明确定义什么是单向函数 “无碰撞”是指,对于x和y的每一对,h(x)不同于h(y),其中x不同于y。这是一个清晰的定义,但很难证明h(x)realy是否是单向函数。您必须比较每对32位数字的哈希结果,并测试它们是否不同 最好的方法是计算所有可能的h(x)并将它们连同它们的x一起存储在一个数组中。然后按h(x)对数组进行排序,然后遍历此列表并测试两个相邻数组是否具有相同的h(x)。如果没有找到相同的邻居,则哈希函数不会发生冲突 但是:如果你真的能做到这一点,你的函数就不可能是一个真正的单向函数,因为你刚刚生成的用来证明无冲突的列表是一个非常快速的查找表,它可以让你在log(n)的搜索时间内找到每个h(x)的x。这可能比从x计算h(x)还要快 让我们计算一下,这需要多长时间 32位整数是介于0和4294967295之间的数字。假设从x计算h(x)需要0.1ms。根据散列算法的不同,即使是在便宜的笔记本上,这也是现实的。所以在1秒内你得到10000个散列数,在一天内得到864000000个。计算所有可能的数字并将其存储在光盘上只需5天 每个条目有4个字节表示32位数字,5个字节表示36位散列。等于9字节。因此,完整的表有38654705664字节。这是38GB。你可以把它存储在每一个低成本的笔记本上。此表的排序需要几分钟,这不计入我们计算所需的5天 所以在一个200美元的二手笔记本上建立这个桌子绝对没有问题。一旦你有了它,很容易证明它是否真的没有碰撞,但是通过构建这个表,你也证明了它不是单向函数 那么什么是最佳解决方案?Algorithm 将32位整数转换为36位整数的单向散列(无冲突)?,algorithm,hash,cryptography,Algorithm,Hash,Cryptography,我想使用单向散列算法(无冲突)将32位整数转换为36位整数 有人能解释一下怎么做吗?“单向”的意思是,很难弄清楚x给出了散列结果h(x)。由于术语“硬”没有明确定义,因此也没有明确定义什么是单向函数 “无碰撞”是指,对于x和y的每一对,h(x)不同于h(y),其中x不同于y。这是一个清晰的定义,但很难证明h(x)realy是否是单向函数。您必须比较每对32位数字的哈希结果,并测试它们是否不同 最好的方法是计算所有可能的h(x)并将它们连同它们的x一起存储在一个数组中。然后按h(x)对数组进行排序
这个38 GB的表现在是您的超级快速绝对无冲突哈希函数。它是任何32到36位哈希函数都可以使用的单向函数。含义:对于给定的h(x),如果很难找到x,则不可能有其他无冲突哈希函数。如果38 GB听起来不小,则可以将与36位块一起使用 首先,将您的32位输入按您喜欢的方式填充到36位 然后生成一组独立的随机密钥
Ki
。你想做多大就做多大。比如说80位。将这些Ki
存储在安全的地方,因为每次“散列”时都会使用它们
对于圆函数F(Ki,x)
,使用SHA1(Ki.x)
截断为18位
这四轮应该很好。它当然是一对一的,因为如果你有Ki
,它实际上是可逆的
(是的,是的,“永远不要发明你自己的密码术”。但是只有32位输入,谁在乎呢?“单向”和“无冲突”很难结合在一起。如果它很难被认为是“单向的”,那么证明它也是无碰撞的可能就太难了。事实上,在现代处理器中,这不可能是单向的。32位可以很容易地强制执行…我假设OP意味着从
h(x)
(long)x获得x的“单向”是(不切实际的)身份函数也会工作。0.1ms似乎是一个巨大的高估。也不需要在表中存储4字节的输入编号,这是由它在表中的位置所暗示的。@NickJohnson:需要存储4字节才能通过h(x)排序将此表转换为反向查找表。如果您想要反向查找表,还有比为每个键复制36位和32位标识符更有效的方法来表示数据。例如,您可以基于36位散列的位构建一个trie。