用于快速文件检查的迭代哈希算法

时间:2015-07-07 21:58:34

标签: algorithm hash

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

sum . product . number of items

"总和"是所有文件的md5数值表示的数字加法。

该产品是所有文件的md5数字表示的乘法。

项目数量只是文件数量。

这样做的主要原因是,当我添加或删除文件时,这允许我创建唯一状态迭代/快速(修改是删除的组合然后加)。另外,最终应该采用相同的状态"即使以任何随机顺序执行相同的操作集。

添加文件

  • 生成文件“md5”
  • 计算md5的数值(x)。
  • x添加到总和
  • 将产品乘以x
  • 增加物品数量。

删除文件

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

问题

由于散列的数值表示可能非常大,我可能必须使用库来使用字符串而不是整数来生成结果,这可能非常慢。

由于我所做的测试有限,我无法创建"碰撞"碰撞是两个不同的文件散列集可以产生相同的状态(请记住,我们忽略了文件散列的顺序)。

问题

我确信自己无法成为第一个想要实现这一目标的人。是否有一个算法或迭代哈希函数,旨在做同样的事情,最好是在PHP,Java或Python?是否存在这类事物的术语,我能想到的只是"迭代哈希"?这个算法是否存在我尚未发现的缺陷,例如"碰撞"使生成的状态表示非唯一?

1 个答案:

答案 0 :(得分:0)

您的文件系统可以使用多少个状态?所有实际目的都是无限的。

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

我会发生碰撞吗?是。

所以,你的哈希方法看起来很好,特别是如果它正确地传播了接近的点,即fs的状态因一个文件哈希的内容而变化到非常不同的值。

但是,从长远来看,你应该依赖你的哈希来产生碰撞,这是一个数学上的确定性,即如果碰撞机会不是0,概率会变成有一天你得到碰撞的概率。

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