2

以下は、ディレクトリまたはサブディレクトリの下に存在する個々のファイルの MD5 / SHA2 サムを再帰的に生成するコードです。

#!/usr/bin/perl -w
use strict;
use warnings;
use File::Find;
use IO::File;
use Digest::MD5;
use Digest::SHA qw(sha256_hex);

find({ wanted => \&process_file, no_chdir => 1 }, @ARGV);

sub process_file {
    #my $md5 = Digest::MD5->new;
    my $sha2 = Digest::SHA->new(256);
    if (-f $_) {
        #print "This is a file: $_\n";
        open(FILE, $_) or die "Can not open $_";
        binmode(FILE);
        #my $md5sum = $md5->addfile(*FILE)->hexdigest;
        my $sha2sum = $sha2->addfile(*FILE)->hexdigest;
        #print sha256_hex(*FILE), "  $_\n";
        close FILE;
        print "$sha2sum  $_\n";
    }
}

上記のコードの出力を以下に示します。

~$ perl list.pl src
f21e1caa364eaad195d968d28187d5cf1a58c0b7b1f21a8ebcb9ca2539dde175  src/test1.pl
4b3277ec41ba0ff8ed6f9f2593c42e08c2f4e9b66df0d63de7c91559ff7e86fa  src/random.py
076231fcbe5887a163278b757f99fb05b27163775ec4706cb2365de3be0906ac  src/test.pl
8806c9f58fc91b2e1d6453a7af7e4f9f8b94e2d0f67a84a89b35bfbf517399be  src/size.pl
5a1b2080ecc53ced45ed3aa13e47118a9ca2f8505b1e89485b6b681d8e1d264c  src/test2.py
5f7c1ff9c7b3dd32f75558dd30324ec085c45a0d0c62190b9a96f211cdf216ea  src/java/test3.class
3728ee1a86443fffe9eafd84db82ce68c9640a0a984958f579b0da1a74283d7c  src/java/test4.wav
d7169ffbb231e93f47d1c54fddf2144b459bba228de48c30b4bc5a4d297be6fb  src/java/test5.java

sha256sum 生成をサポートするようにコードを更新しました。

ここで、これらの MD5 / SHA2 合計を入力として組み合わせた MD5 / SHA2 合計を生成したいと考えています。

4

2 に答える 2

1
  1. Digest::MD5perl v5.7.3 (2002 年 3 月) [1] で Core モジュールとして最初にリリースされました。今日広く使用されている最も古いバージョンの perl は v5.8.8 であるため、遭遇するすべての perl でこのモジュールが利用可能です。

  2. Digest::MD5私が見つけた最も古いバージョン(1998 年の v1.99.59-TRIAL ) には、既にaddandaddfileメソッドが含まれています。そのため、どのバージョンのモジュールに遭遇しても、addメソッドを利用できます。

したがって、コマンド ライン ツールを呼び出すような醜くて移植性のないハックを使用する代わりに、その機能に安全に依存することができます。

チェックサムが再現できるように、特定の順序で各ディレクトリをトラバースするようにしてください。

MD5 は実質的に壊れたアルゴリズムであり、レガシー システムとのインターフェース以外では使用しないでください。ハッシュ関数の SHA-2 ファミリは、高速なハッシュが必要なほとんどのタスクに適しています。


[1] のcorelistコマンド ライン ツールを使用してModule::Corelist、さまざまな perl バージョンのコア モジュールを照会します。

于 2014-01-27T18:35:13.850 に答える
0

試す:

use File::Find 'find';
use Digest::SHA 'sha256_hex';

my @allsums;

sub process_file {
  push @allsums, Digest::SHA->new(256)->addfile($_)->hexdigest . " $_" if -f $_;
}

find({ wanted => \&process_file, no_chdir => 1 }, @ARGV);

print sha256_hex(join ':', sort @allsums), "\n";
于 2014-01-28T12:12:12.247 に答える