Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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 快速文件检查的迭代哈希算法_Algorithm_Hash - Fatal编程技术网

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

Algorithm 快速文件检查的迭代哈希算法,algorithm,hash,Algorithm,Hash,我想创建文件夹中所有文件状态的表示形式(忽略顺序),以便将此状态发送到另一台计算机以检查我们是否同步。此“状态表示”是由连接的3个数字,它们是: sum . product . number of items “总和”是文件的所有md5数字表示的数字相加 该乘积是文件所有md5数字表示形式的乘积 项目数就是文件数 这样做的主要原因是,这允许我在添加或删除文件时以迭代/快速的方式创建唯一的状态(修改是先删除后添加的组合)。此外,即使以任意随机顺序执行同一组操作,也应以相同的“状态”结束 添加文件

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

sum . product . number of items
“总和”是文件的所有md5数字表示的数字相加

该乘积是文件所有md5数字表示形式的乘积

项目数就是文件数

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

添加文件
  • 生成文件的md5
  • 计算md5的数值(
    x
  • x
    添加到总和
  • 将乘积乘以
    x
  • 增加项目的数量
删除文件
  • 生成文件的md5
  • 计算md5的数值(
    x
  • 从总和中减去
    x
  • 将产品除以
    x
  • 减少项目的数量
问题 由于散列的数值表示可能相当大,我可能不得不使用一个库来生成使用字符串而不是整数的结果,这可能非常慢

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

问题
我相信我不会是第一个想要实现这样一件事的人。是否有一种算法或迭代哈希函数,其目标是在PHP、Java或Python中完成同样的事情?这类事情有没有一个术语,我能想到的就是“迭代散列”?该算法是否存在我没有发现的缺陷,例如“冲突”使生成的状态表示不唯一?

文件系统可以接受多少状态?在所有实际用途中都是无限的

你的散列长度有多长?短到足以有效,在任何情况下都是有限的

我会有碰撞吗?对

因此,您的散列方法似乎很好,特别是如果它正确地传播接近的点,即仅一个文件的内容不同的fs的状态散列到非常不同的值

然而,从长远来看,你应该依靠你的散列来产生冲突,这是一个数学上确定的概率,有一天你会得到一个冲突,因为冲突的几率不是0


因此,为了真正安全,您可能需要一个完整的MD5交换,如果速度和快速更新是您的目标,那么您的方案听起来不错,但我会用更不频繁的长密钥交换来支持它,如果同步是任务关键的,为了安全起见

在Java中,您可以使用
biginger
进行计算,这有点麻烦,但也不太糟糕。它将是3.3.1->0.1.0,如果你的第二个文件散列值是4,它将是4.4.1,所以是的。(更新-回复的评论似乎已经消失)@biziclop,谢谢,如果没有人能在这个想法上捅破洞,我会先在Java实现中使用它。虽然你自己开发的临时方法可能很适合你,你可能还想研究一种更标准的方法,散列的乘积不一定是存储的好东西——很多不同的数字可以有相同的乘积。你确定这真的是最好的方法吗?同时,由于溢出,多重应用和除法以及加法和减法不能作为可逆操作使用。对两个字(位)可以执行的唯一可逆操作是XOR,其他任何操作都是不可逆的。无符号算术是2的大幂的模,所以无符号整数的加减是绝对可逆的。乘法(模2的大幂)不是很有用,因为如果你将几百个随机值相乘,结果很可能是0。@rici感谢你的输入。我必须找到一个不同的数学关系来代替乘/除,或者使用一些代码来处理无限大小的数字的乘法,这可能非常慢或者内存不足(还没有尝试过)。我想在您的例子中,我只需对文件进行排序,然后连接它们的MD5,最后在这个大字符串(有时称为摘要)上计算MD5。根据我的经验,MD5相当快,所以对摘要进行散列是可以的。您最终得到一个MD5键,长度由您选择。当然,您会得到一些计算时间开销,但是这个方案是“可靠的”,从加密的角度来看,它可以很好地工作。请注意,对文件进行排序非常重要,以便在不同的机器上获得相同的密钥。