/[cvs]/nfo/perl/libs/Data/Transfer/Sync/Compare/Checksum.pm
ViewVC logotype

Annotation of /nfo/perl/libs/Data/Transfer/Sync/Compare/Checksum.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.4 - (hide annotations)
Thu May 6 12:53:07 2004 UTC (20 years, 3 months ago) by jonen
Branch: MAIN
Changes since 1.3: +13 -3 lines
+ added use of File::RsycP::digest

1 jonen 1.4 ## $Id: Checksum.pm,v 1.3 2003/05/13 08:19:00 joko Exp $
2 joko 1.1 ##
3     ## Copyright (c) 2002 Andreas Motl <andreas.motl@ilo.de>
4     ##
5     ## See COPYRIGHT section in pod text below for usage and distribution rights.
6     ##
7     ## ----------------------------------------------------------------------------------------
8 joko 1.2 ## $Log: Checksum.pm,v $
9 jonen 1.4 ## Revision 1.3 2003/05/13 08:19:00 joko
10     ## switched to crc32
11     ##
12 joko 1.3 ## Revision 1.2 2003/02/11 09:53:07 joko
13     ## + metadata-structure-change, fixed some code here
14     ##
15 joko 1.2 ## Revision 1.1 2003/02/09 05:10:13 joko
16     ## + initial commit
17     ##
18 joko 1.1 ## ----------------------------------------------------------------------------------------
19    
20    
21 joko 1.3 =pod
22    
23     =head1 Todo
24    
25     o Data::Transfer::Sync::Compare::Slot using Compare::Struct
26    
27     =cut
28    
29 joko 1.1 package Data::Transfer::Sync::Compare::Checksum;
30    
31     use strict;
32     use warnings;
33    
34     use mixin::with qw( Data::Transfer::Sync );
35    
36    
37     use Data::Dumper;
38    
39 joko 1.3 # TODO: Load these appropriatly at runtime.
40     use Digest::MD5 qw( md5 md5_hex md5_base64 );
41     use String::CRC32;
42 jonen 1.4 use File::RsyncP::Digest;
43 joko 1.1
44     # get logger instance
45     my $logger = Log::Dispatch::Config->instance;
46    
47    
48 joko 1.3 # Maybe refactor to shortcuts::checksum?
49 joko 1.1 sub _calcChecksum {
50    
51     my $self = shift;
52     my $descent = shift;
53     my $specifier = shift;
54    
55     # calculate checksum for current object
56     my $ident = $self->{node}->{$descent}->{ident};
57    
58     # build dump of this node
59     my $payload = $self->{node}->{$descent}->{payload};
60     #my $dump = $ident . "\n" . $item->quickdump();
61     #my $dump = $ident . "\n" . Dumper($item);
62     my $dump = $ident . "\n" . $self->_dumpCompact($payload);
63    
64     # TODO: $logger->dump( ... );
65     #$logger->debug( __PACKAGE__ . ": " . $dump );
66     #$logger->dump( __PACKAGE__ . ": " . $dump );
67    
68     # calculate checksum from dump
69 joko 1.3
70     # 1. md5-based fingerprint, base64 encoded (from Digest::MD5)
71     #$self->{node}->{$descent}->{checksum} = md5_base64($dump) . '==';
72    
73     # 2. 32-bit integer "hash" value (maybe faster?) (from DBI)
74     # Note: The 32-bit integer hash from DBI seems to generate duplicates
75     # with small payloads already in ranges of hundreds of items/rows!!!
76     # Try to avoid it or try to use it only for payloads greater than, hmmm, let's say 30 chars?
77     # (we had about 15 chars average per item (row))
78     # Possible (generic) solution: Just generate checksum, if length(checksum(payload)) < payload
79 joko 1.1 #$self->{node}->{$descent}->{checksum} = DBI::hash($dump, 1);
80 joko 1.3
81     # 3. good ol' crc32???
82 jonen 1.4 #$self->{node}->{$descent}->{checksum} = crc32($dump);
83 joko 1.3
84 jonen 1.4 # 4. File::RsyncP::Digest - Perl interface to rsync message digest algorithms
85     my $rsDigest = new File::RsyncP::Digest;
86     $rsDigest->add($dump);
87     my $digest = $rsDigest->digest();
88     $self->{node}->{$descent}->{checksum} = unpack("H*", $digest);
89    
90     # 5. some more modern Digest::SHA1 or similar?
91 joko 1.1
92     # signal good
93     return 1;
94    
95     }
96    
97    
98     sub _readChecksum {
99     my $self = shift;
100    
101     my $descent = shift;
102    
103     # signal checksum bad
104     if (!$self->{node}->{$descent}) {
105     return;
106     }
107    
108     # trace
109     #print "desc: $descent", "\n";
110     #print Dumper($self);
111 joko 1.2 #print Dumper($self->{meta}->{$descent});
112 joko 1.1 #exit;
113    
114     # get checksum for current entry
115     # TODO: don't have the checksum column/property hardcoded as "cs" here, make this configurable somehow
116 joko 1.2 if ($self->{meta}->{$descent}->{isChecksumAuthority}) {
117 joko 1.1 $self->_calcChecksum($descent);
118     } else {
119     $self->{node}->{$descent}->{checksum} = $self->{node}->{$descent}->{payload}->{cs};
120     }
121    
122     # signal checksum good
123     return 1;
124    
125     }
126    
127    
128     1;
129 joko 1.3 __END__

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed