1

のように作成されたダイジェストを取ることは可能ですか?

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

そして$digestbase10に変換しますか(hexまたはbase64の代わりに?)、またはhexdigestを5つに分割してから整数に変換できますか?それはうまくいくでしょうか?ダイジェストを整数として保存する方法を考え出そうとしています (はい、誰かが私が頭がおかしい、または愚かである、おそらくその両方であると考えるでしょう)。

アップデート

理論的には、最終的にエンコードされた整数出力を取得し、必要に応じて逆にして16進数と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 に答える