From: Eric Wong (Contractor, The Linux Foundation) Date: Fri, 2 Mar 2018 18:27:54 +0000 (+0000) Subject: content_id: no need to be human-friendly X-Git-Tag: v1.1.0-pre1~194 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=9e9863aa5fb74358cd2b5960e4d8d16f1ee9fece;hp=af2e250ca2704d06afe0a7ed862dcfca7f740de7;p=public-inbox.git content_id: no need to be human-friendly 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. --- diff --git a/lib/PublicInbox/ContentId.pm b/lib/PublicInbox/ContentId.pm index d1a009e7..8347de2d 100644 --- a/lib/PublicInbox/ContentId.pm +++ b/lib/PublicInbox/ContentId.pm @@ -5,7 +5,7 @@ package PublicInbox::ContentId; 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 @@ -14,10 +14,9 @@ use Digest::SHA; # 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 @@ -37,7 +36,11 @@ sub content_id ($;$) { $dig->add("$h: $_") foreach @v; } $dig->add($mime->body_raw); - 'SHA-' . $dig->algorithm . ':' . $dig->hexdigest; + $dig; +} + +sub content_id ($) { + content_digest($_[0])->digest; } 1; diff --git a/t/content_id.t b/t/content_id.t index c0ae6ecd..adcdb6c1 100644 --- a/t/content_id.t +++ b/t/content_id.t @@ -18,7 +18,8 @@ my $mime = Email::MIME->create( 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'); done_testing();