1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
#! /usr/local/bin/perl -w
#
# $Id$
#
use strict;
my $PP = 0;
eval { require Digest::MD5; };
require Digest::Perl::MD5, $PP = 1 if $@;
my $ctx = $PP ? Digest::Perl::MD5->new() : Digest::MD5->new();
my $TEST_BLOCK_LEN = 10_000;
my $TEST_BLOCK_COUNT = 100_000;
my ($r,$q,$p) = (0)x3;
# reading options:
while (my $input = shift) {
unless ($input =~ s/^-//) { unshift @ARGV, $input; last; }
for my $opt (split //, $input) {
if ($opt eq 'p') {
$p = 1;
} elsif ($opt eq 'q') {
$q = 1;
} elsif ($opt eq 'r') {
$r = 1;
} elsif ($opt eq 't') {
local $|=1;
print "MD5 time trial. Digesting $TEST_BLOCK_COUNT $TEST_BLOCK_LEN-byte blocks ... ";
my $block;
for (0..$TEST_BLOCK_LEN-1) { $block .= chr($_ & 0xff) }
my $start = time;
for (1..$TEST_BLOCK_COUNT) { $ctx->add($block) }
my $stop = time;
my $diff = $stop - $start; $diff = 1 if $diff <= 0;
print "done\n";
print "Digest = ", $ctx->hexdigest(), "\n";
print "Time = $diff seconds\n";
print "Speed = ", int $TEST_BLOCK_LEN*$TEST_BLOCK_COUNT / $diff, " bytes/second\n";
exit;
} elsif ($opt eq 'x') {
print "MD5 test suite:\n";
for (
"",
"a",
"abc",
"message digest",
"abcdefghijklmnopqrstuvwxyz",
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
"12345678901234567890123456789012345678901234567890123456789012345678901234567890"
) {
md5print(qq'"$_"', $ctx->add($_)->hexdigest());
}
exit;
} elsif ($opt eq 's') {
unless (@ARGV) {
die "md5: option requires an argument -- s\n", usage();
}
my $text = shift;
md5print(qq'"$text"', $ctx->add($text)->hexdigest());
} else {
die "md5: illegal option -- $opt\n", usage();
}
}
}
# files
my $file;
@ARGV = '-' unless @ARGV;
foreach $file (@ARGV) {
my $fh;
if ($file eq '-') {
$fh = \*STDIN;
$q = 1;
} else {
open $fh, $file or die "md5: $file: $!\n";
}
if ($p) {
my ($len,$buf) = (0,'');
while ( $len = read STDIN, $buf, 8192 ) {
print $buf;
$ctx->add($buf);
}
die "read failed: $!\n" unless defined $buf;
md5print('',$ctx->hexdigest());
} else {
md5print($file, $ctx->addfile($fh)->hexdigest());
}
}
sub usage { "usage: md5 [-pqrtx] [-s string] [files ...]\n" }
sub md5print {
my ($file, $md5) = @_;
if ($q) { print "$md5\n"; return }
print $r ? "$md5 $file" : "MD5 ($file) = $md5", "\n";
}
|