преобразовать дайджест в base10

Можно ли взять дайджест, созданный наподобие

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

а затем преобразовать $digest в base10 (вместо шестнадцатеричного или base64?) или вы могли бы разделить шестнадцатеричный дайджест на 5 штук, а затем преобразовать их в целые числа? это сработает? Попытка придумать способ хранения дайджеста в виде целых чисел (да, я знаю, что кто-то подумает, что я сумасшедший или глупый, возможно, и то, и другое).

обновить

Теоретически я должен быть в состоянии взять окончательный закодированный целочисленный вывод и по мере необходимости перекодировать и перекодировать в шестнадцатеричный код и base64.


person xenoterracide    schedule 06.08.2010    source источник


Ответы (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 — нет. Но при необходимости достаточно легко удалить = в конце.

person cjm    schedule 06.08.2010

Если куда бы вы ни отправились, вы можете обрабатывать целые числа произвольной точности, не вздрагивая (да, однозначно, но вы никогда не знаете), то вы можете просто закодировать это как одно целое число;)

$ 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
person hobbs    schedule 06.08.2010

Что-то вроде этого, может быть?

#!/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
person Sinan Ünür    schedule 06.08.2010
comment
похоже на решение, которое я взломал (хотя, вероятно, лучше из-за карты), можно ли его отменить? под обратным я имею в виду, могу ли я взять его из целых чисел и преобразовать в кодировку base64 (это то же самое, что кодирование base64 дайджеста), если я захочу? - person xenoterracide; 06.08.2010