2015-12-08 30 views
0

我有问题需要比较.tar.gz文件中的文件,以确保gzip中的文件都不重复。我目前正在使用ICSharpCode.SharpZipLib,它可以很容易地检查Zip文件中的重复项,因为ZipEntry具有“CRC”属性。这很简单,因为我可以获取crc和文件大小,并使用LINQ找到任何匹配散列和大小的文件,然后抛出错误或执行任何必要的操作。计算散列或比较c#中gzip文件的内容

但是,除了标准的GetHashCode方法外,TarEntry没有这样的属性或方法,我的理解也是从文件元数据计算哈希值,因此同一个文件的副本没有相同的哈希值。我能(快​​速)计算gzip文件内容的散列吗?还是有另一种方法来比较内容?

+1

如果你只是想检查'.tar.gz'文件本身是否是其他'.tag.gz'文件的副本,那么该文件的'sha1'或'sha256'散列就足够了。如果打算打开存档并单独检查每个文件,则不确定要在那里显示哪些内容,但加密散列仍然是确定内容相等的最佳选择。 – ray

+0

是的,我正在比较.tar.gz中的每个文件,以确保文件中没有重复项。 (还是)感谢你的建议。我稍后可能会执行它来自己检查.tar.gz文件。 – ilyketurdles

+0

不幸的是,我没有看到你怎么做你想做的事情,而无需首先提取所有内容。看起来你需要解压+解压档案,然后用加密哈希处理每个单独的文件,但是你必须将所有内容与其他所有内容进行比较 - “O(n^2)”操作。我认为你想要做的是一个坏主意。考虑直接检查档案。如果你担心重复,那么在它们被创建之前先试着照顾它。 – ray

回答

0

首先,如果两个文件具有不同的长度,那么马上就知道它们不可能相等。因此,将它用作zip或tar作为第一个过滤器。其次,散列会告诉你两个文件是否不同,但它不能告诉你它们是相同的。如果平等很少,那么散列是排除大多数竞争者平等的好方法。假设散列值已经被计算出来。但是,如果两个散列值相等,则需要直接比较文件以查看它们是否相等。

如果一个散列还没有被计算出来,那么跳过计算一个散列并且简单地比较长度相等的文件通常会更快。唯一不会更快的方法是,如果您经常拥有相同长度和通用前缀的文件集,以便它们仅在文件中有一定的长度差异。