1

是否可以采取像这样创建的摘要

my $digest  = Digest::SHA->new('sha1')->add('hello')->digest;

然后转换$digest为base10(而不是十六进制或base64?)或者你可以将一个hexdigest分成5块然后将它们转换为整数?那行得通吗?试图想出一种将摘要存储为整数的方法(是的,我知道有人会认为我疯了或愚蠢,可能两者兼而有之)。

更新

从理论上讲,我应该能够根据需要将最终编码的整数输出并反转并重新编码为十六进制和 base64。

4

3 回答 3

4

如果无论您要去哪里都可以处理任意精度的整数而不会退缩(是的,很可能,但您永远不知道),那么您可以将其编码为单个整数;)

$ re.pl
$ use Digest::SHA; use Math::BigInt;

$ my $hex = Digest::SHA->new("SHA-1")->add("hello")->hexdigest;
aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
$ Math::BigInt->from_hex("0x" . $hex)->bstr
975987071262755080377722350727279193143145743181
$ Math::BigInt->new("975987071262755080377722350727279193143145743181")->as_hex
0xaaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
于 2010-08-06T06:24:47.980 回答
3

我认为pack&unpack可能会更有效:

use Digest::SHA;

my $digest  = Digest::SHA->new('sha1')->add('hello')->digest;
my @ints = unpack('N*', $digest);
print "@ints\n";

my $redone = pack('N*', @ints);

print "match\n" if $digest eq $redone;

my $hexdigest = sprintf '%08x' x @ints, @ints;
print "$hexdigest\n";
printf "%s\n", Digest::SHA->new('sha1')->add('hello')->hexdigest;

use MIME::Base64 'encode_base64';
my $b64digest = encode_base64(pack('N*', @ints));
print $b64digest;
printf "%s\n", Digest::SHA->new('sha1')->add('hello')->b64digest;

输出:

2868168221 3703957666 3669941775 994585817 2930328397
match
aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
qvTGHdzF6KLavt4PO0gs2a6pQ00=
qvTGHdzF6KLavt4PO0gs2a6pQ00

请注意,MIME::Base64填充结果,而b64digest方法没有。=但是,如果需要,可以很容易地去除尾随。

于 2010-08-06T05:48:33.917 回答
0

像这样的东西,也许?

#!/usr/bin/perl

use strict; use warnings;
use Digest::SHA;
use YAML;

my $digest  = Digest::SHA->new('sha1')->add('hello')->hexdigest;
print "$digest\n";
print Dump [ map { [$_, hex] } $digest =~ /([[:xdigit:]]{8})/g ];

输出:

aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
---
-
  - aaf4c61d
  - 2868168221
-
  - dcc5e8a2
  - 3703957666
-
  - dabede0f
  - 3669941775
-
  - 3b482cd9
  - 994585817
-
  -aea9434d
  - 2930328397
于 2010-08-06T04:19:56.593 回答