2015-12-08 8 views
0

У меня проблема с необходимостью сравнивать файлы в файлах .tar.gz, чтобы гарантировать, что ни один из файлов в gzip не дублирует. В настоящее время я использую ICSharpCode.SharpZipLib, что упрощает проверку дубликатов в Zip-файлах, поскольку ZipEntry имеет свойство «CRC». Это довольно просто, так как я могу получить crc и filesize и использовать LINQ для поиска любых файлов, которые соответствуют хешу и размеру, а затем бросать ошибку или делать все, что необходимо.Вычислить хэш или сравнить содержимое gzip-файлов в C#

Однако TarEntry не имеет такого свойства или метода, кроме стандартного метода GetHashCode, который, насколько я понимаю, также вычисляет хэш из метаданных файла, поэтому копии одного и того же файла не имеют одинакового хеша. Я могу (быстро) вычислить хэш содержимого файлов gzip? Или есть другой способ сравнить содержимое?

+1

Если вы просто хотите проверить, является ли сам файл '.tar.gz' дубликатом какого-либо другого файла' .tag.gz', то должен быть достаточно хэш-файла 'sha1' или' sha256'. Если вы собираетесь открыть архив и проверить каждый файл по отдельности, не знаете, что предложить там, но криптографический хеш все равно будет лучшим выбором для определения равенства содержания. – ray

+0

Да, я хочу сравнить каждый файл внутри .tar.gz, чтобы убедиться, что в нем нет дубликатов. Спасибо за предложение. Я, вероятно, буду реализовывать это позже, чтобы проверить сами файлы .tar.gz. – ilyketurdles

+0

К сожалению, я не вижу, как вы будете делать то, что хотите, без предварительного извлечения всего содержимого. Кажется, вам нужно распаковать + извлечь архив, а затем обработать каждый отдельный файл криптовым хешем, но вам придется сравнивать все с остальными - 'O (n^2)'. Я думаю, что вы пытаетесь сделать, это плохая идея. Рассмотрите возможность проверки архивов напрямую. Если вы беспокоитесь о дубликатах, попробуйте позаботиться об этом, прежде чем они будут созданы в первую очередь. – ray

ответ

0

Во-первых, если два файла имеют разную длину, то с самого начала вы знаете, что они не могут быть равными. Поэтому используйте это как для zip, так и для tar в качестве вашего первого фильтра.

Во-вторых, хеш скажет вам, если два файла отличаются друг от друга, но он не может сказать вам, что они одинаковы. Если равенство встречается редко, то хэш - хороший способ исключить большинство претендентов на равенство. Предполагая, что значения хэша уже вычислены. Однако, если два значения хэша равны, вам нужно сравнить файлы напрямую, чтобы убедиться, что они равны.

Если хэш еще не был вычислен, то, как правило, быстрее пропускать вычисления хеша и просто сравнивать файлы с равной длиной. Единственным способом, который не был бы быстрее, было бы, если бы у вас часто были наборы файлов с одинаковой длиной и общими префиксами, так что они только отличались бы значительной длиной в файле.