【问题标题】:Iterative Hash Algorithm for Fast File Check用于快速文件检查的迭代哈希算法
【发布时间】:2015-09-25 14:53:15
【问题描述】:

我想创建一个文件夹中所有文件状态的表示(忽略顺序),以便我可以将此状态发送到另一台计算机以检查我们是否同步。这种“状态表示”是由. 连接的 3 个数字,它们是:

sum . product . number of items

“总和”是文件的所有 md5 数字表示形式的数字相加。

乘积是文件所有 md5 数字表示的乘积。

项目数就是文件数。

这样做的主要原因是,这允许我在添加或删除文件时创建唯一状态迭代/快速(修改是删除的组合然后加)。此外,即使以任何随机顺序执行相同的一组操作,也应该以相同的“状态”结束。

添加文件

  • 生成文件的 md5
  • 计算 md5 的数值 (x)。
  • x 加到总和中
  • 乘以x
  • 增加项目数。

删除文件

  • 生成文件的 md5
  • 计算 md5 的数值 (x)。
  • 从总和中减去x
  • 将产品除以x
  • 减少项目数。

问题

由于哈希的数字表示可能非常大,我可能不得不使用一个库来使用字符串而不是整数来生成结果,这可能会很慢。

通过我所做的有限测试,我无法创建“冲突”,其中冲突是两组不同的文件散列可能产生相同的状态(请记住,我们忽略了文件散列的顺序) .

问题

我敢肯定,我不可能是第一个想要实现这一目标的人。是否有一种算法或迭代哈希函数旨在做同样的事情,最好是在 PHP、Java 或 Python 中?这种事情有没有一个术语,我能想到的就是“迭代哈希”?这个算法是否存在我没​​有发现的缺陷,例如“碰撞”使生成的状态表示不唯一?

【问题讨论】:

  • 在Java中你可以使用BigInteger进行计算,有点麻烦但还不错。
  • 如果第一个文件的哈希值为 3。那么它将是 3.3.1 -> 0.1.0 那么如果您的第二个文件的哈希值为 4,它将是 4.4.1,所以是的。 (更新 - 回复的评论似乎消失了)
  • @biziclop,谢谢,如果没有人设法在这个想法中戳个洞,我将首先在 Java 实现中使用它。
  • 虽然您自己开发的即席方法可能很好地满足您的目的,但您可能还想调查类似counting Bloom filters 这样的方法,这将是一种更标准的方法。
  • 哈希的乘积不一定是一个好东西存储 - 许多不同的数字可以有相同的乘积。你确定这真的是最好的方法吗?

标签: algorithm hash


【解决方案1】:

您的文件系统可以采用多少种状态?出于所有实际目的,无穷大。

你的哈希长度有多长?短到足够高效,在任何情况下都是有限的。

我会发生碰撞吗?是的。

因此,您的哈希方法看起来不错,特别是如果它正确传播了接近的点,即 fs 的状态因仅一个文件哈希的内容而不同而具有非常不同的值。

但是,从长远来看,您应该依靠您的哈希来产生碰撞,这是一个数学上的确定性,假设碰撞几率不是 0,那么有一天您会发生碰撞。

所以为了真正安全,你可能需要一个完整的 MD5 交换,如果速度和快速更新是你的方案听起来不错的目标,但我会通过更不频繁地交换更长的密钥来支持它,只是为了安全起见如果同步是关键任务。

【讨论】:

  • 此外,由于溢出,乘法和除法以及加法和减法都不能作为可逆操作。您可以对两个字(位)执行的唯一可逆操作是 XOR,其他任何操作都是不可逆的.
  • 无符号算术是以 2 的大幂为模的,因此无符号整数的加减法是绝对可逆的。但是,乘法(以 2 的大幂为模)并不是很有用,因为如果您将数百个随机值相乘,结果很可能为 0。
  • @rici 感谢您的意见。我将不得不找到一个不同的数学关系来替换乘法/除法,或者使用一些可以处理无限大小数字的乘法的代码,这可能非常慢或内存不足(尚未尝试过)。 1-armed-blog.blogspot.co.uk/2012/05/…
  • 我认为在你的情况下,我会简单地对文件进行排序,然后连接它们的 MD5,最后在这个大字符串(有时称为摘要)上计算一个 MD5。根据我的经验,MD5 相当快,所以散列摘要是可以的。你最终得到一个 MD5 密钥,长度你可以选择。当然,你会得到一些计算时间开销,但这个方案是“可靠的”,从加密的角度来看它可以正常工作。请注意,对文件进行排序是必不可少的,这样您才能在不同的机器上获得相同的密钥。
猜你喜欢
  • 2012-07-05
  • 2011-11-12
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多