Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 将32位整数转换为36位整数的单向散列(无冲突)?_Algorithm_Hash_Cryptography - Fatal编程技术网

Algorithm 将32位整数转换为36位整数的单向散列(无冲突)?

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)对数组进行排序

我想使用单向散列算法(无冲突)将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美元的二手笔记本上建立这个桌子绝对没有问题。一旦你有了它,很容易证明它是否真的没有碰撞,但是通过构建这个表,你也证明了它不是单向函数

那么什么是最佳解决方案?

  • 生成4294967296个随机36位数字的列表,在每个条目中添加一个32位数字,即条目行号(从0开始)
  • 对列表进行排序
  • 重置did-change-a-number-flag
  • 浏览列表。将实际条目与上一条目进行比较。如果它们不同,请转至步骤7
  • 用新的随机36位数字替换36位数字
  • 设置did-change-a-number-flag
  • 如果您到达列表的末尾:是否设置了标志?如果是,请转至步骤2
  • 按32位编号(前一行号)对列表进行排序
  • 在步骤1之后,列表将包含6.25%的碰撞(约2.684亿次碰撞)。在每次迭代中,将碰撞次数减少到第16部分。大约需要8次迭代才能消除所有碰撞


    这个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。