我正在编写一些内容,通过散列其内容样本来总结文件系统中的文件.它构造了一个目录和文件树.每个文件条目都具有文件内容的哈希值.对于每个目录条目,我想存储目录中所有文件内容的哈希值,包括子目录中的那些 - 我将其称为目录内容哈希.
关于目录内容哈希的棘手问题是我希望它独立于目录的结构.如果两个目录包含相同的文件,但是使用不同的子目录结构组织,则哈希值应该相同.
我能想到的唯一两种方法是:
计算所有文件内容哈希值的串联的MD5.为了获得所需的哈希属性,我必须列出目录中的所有文件,按哈希对它们进行排序,连接已排序的哈希值,然后在串联上运行MD5.这似乎比我想要的慢.我可以通过使用合并排序非常有效地进行排序,同时计算整个树中的目录内容哈希值,但我无法计算大量输入上的大量MD5哈希值.
使用XOR组合文件内容哈希.每个目录只需要对其直接子节点的文件内容哈希和目录内容哈希进行异或.这非常快速和简单,但不是非常抗冲击.它甚至无法区分包含1个文件实例的目录和包含同一文件的3个实例的目录.
如果有一个函数可以使用类似于方法#2中使用XOR的方式,那就更好了,但更具抗冲突性.我认为方法#1对于这个具体案例来说足够快,但为了探索所有选项/知识好奇心/未来应用程序,我想知道是否有一个满足描述的函数标题(我有一个模糊的记忆,想要过去几次想要这样的功能).
谢谢.
哈希集合的顺序无关哈希(本质上是您要查找的内容,不是吗?)
听起来任何顺序无关的操作(例如加法或乘法)都可以为您解决问题。加法的好处是可以很好地溢出。我不记得乘法是否同样适用。
简而言之:添加所有值,而忽略溢出,您将获得一些有用的信息。如果添加的抗碰撞能力不足,则任何其他类似功能都可以解决问题。
由于项目的数量很重要,但顺序并不重要;只需对哈希列表进行排序,然后对列表进行哈希处理。
find . -print0 | xargs -0 sha1sum | cut -c -40 | sort | sha1sum
Run Code Online (Sandbox Code Playgroud)
这将给出对目录排列不变的哈希值类型。