Могу ли я получить сумму MD5 каталога с Perl? - PullRequest
0 голосов
/ 26 мая 2009

Я пишу Perl-скрипт (в Windows), который использует File :: Find для индексирования сетевой файловой системы. Это прекрасно работает, но сканирование файловой системы занимает очень много времени. Я подумал, что было бы неплохо как-то получить контрольную сумму каталога перед его обходом, и если контрольная сумма совпадает с контрольной суммой, полученной при предыдущем запуске, не проходите через каталог. Это исключило бы большую обработку, так как файлы в этой файловой системе меняются не часто.

В моем AIX я использую эту команду:

csum -h MD5 /directory

, который возвращает что-то вроде этого:

5cfe4faf4ad739219b6140054005d506  /directory

Команда занимает очень мало времени:

time csum -h MD5 /directory
5cfe4faf4ad739219b6140054005d506  /directory

real    0m0.00s
user    0m0.00s
sys     0m0.00s

Я искал CPAN для модуля, который будет делать это, но похоже, что все модули будут давать мне сумму MD5 для каждого файла в каталоге, а не для самого каталога.

Есть ли способ получить сумму MD5 для каталога в Perl или даже в Windows, если я могу вызвать команду Win32 из Perl?

Заранее спасибо!

Ответы [ 5 ]

3 голосов
/ 26 мая 2009

Можете ли вы просто прочитать даты последнего изменения файлов и папок? Конечно, это будет быстрее, чем строить MD5?

2 голосов
/ 26 мая 2009

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

1 голос
/ 04 июня 2009

В дополнение к другим хорошим ответам, позвольте мне добавить следующее: если вы хотите контрольную сумму , тогда используйте алгоритм контрольной суммы вместо (( не работает! ) хеш-функция .

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

Это правда, что пользователь может изменить каталог таким образом, который не будет обнаружен контрольной суммой. Тем не менее, пользователь должен будет изменить имена файлов, как это преднамеренно, так как нормальные изменения в именах файлов (с высокой вероятностью) дают разные контрольные суммы. Тогда нужно ли защищаться от этой «атаки»?

Всегда следует учитывать последствия каждой атаки и выбирать соответствующие инструменты.

1 голос
/ 26 мая 2009

Из того, что я знаю, вы не можете получить md5 каталога. md5sum в других системах жалуется, когда вы предоставляете каталог. csum, скорее всего, дает вам хэш содержимого файла каталога каталога верхнего уровня, не проходя по дереву.

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

sub dirModified($){
    my $dir = @_[0];
    opendir(DIR, "$dir");
    my @dircontents = readdir(DIR);
    closedir(DIR);

    foreach my $item (@dircontents){
        if( -f $item ){
            print -M $item . " : $item - do stuff here\n";
        } elsif( -d $item && $item !~ /^\.+$/ ){
            dirModified("$dir/$item");
        }
    }
}

Да, это займет некоторое время.

0 голосов
/ 30 октября 2009

Я сделал один из них на python, если вам интересно:

http://akiscode.com/articles/sha-1directoryhash.shtml

...