【发布时间】: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 这样的方法,这将是一种更标准的方法。
-
哈希的乘积不一定是一个好东西存储 - 许多不同的数字可以有相同的乘积。你确定这真的是最好的方法吗?