We merely use this for internal comparisons and do not store
this in Xapian. So using a shorter, non-human readable digest
is enough. Furthermore, introduce "content_digest" which
returns the Digest::SHA object for extra changes.
use strict;
use warnings;
use base qw/Exporter/;
use strict;
use warnings;
use base qw/Exporter/;
-our @EXPORT_OK = qw/content_id/;
+our @EXPORT_OK = qw/content_id content_digest/;
use PublicInbox::MID qw(mids references);
# not sure if less-widely supported hash families are worth bothering with
use PublicInbox::MID qw(mids references);
# not sure if less-widely supported hash families are worth bothering with
# Content-* headers are often no-ops, so maybe we don't need them
my @ID_HEADERS = qw(Subject From Date To Cc);
# Content-* headers are often no-ops, so maybe we don't need them
my @ID_HEADERS = qw(Subject From Date To Cc);
-sub content_id ($;$) {
- my ($mime, $alg) = @_;
- $alg ||= 256;
- my $dig = Digest::SHA->new($alg);
+sub content_digest ($) {
+ my ($mime) = @_;
+ my $dig = Digest::SHA->new(256);
my $hdr = $mime->header_obj;
# References: and In-Reply-To: get used interchangeably
my $hdr = $mime->header_obj;
# References: and In-Reply-To: get used interchangeably
$dig->add("$h: $_") foreach @v;
}
$dig->add($mime->body_raw);
$dig->add("$h: $_") foreach @v;
}
$dig->add($mime->body_raw);
- 'SHA-' . $dig->algorithm . ':' . $dig->hexdigest;
+ $dig;
+}
+
+sub content_id ($) {
+ content_digest($_[0])->digest;
body => "hello world\n",
);
body => "hello world\n",
);
-my $res = content_id($mime);
-like($res, qr/\ASHA-256:[a-f0-9]{64}\z/, 'cid in format expected');
+my $orig = content_id($mime);
+my $reload = content_id(Email::MIME->new($mime->as_string));
+is($orig, $reload, 'content_id matches after serialization');