конвертировать дайджест в base10 - PullRequest
1 голос
/ 06 августа 2010

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

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

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

обновление

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

Ответы [ 3 ]

4 голосов
/ 06 августа 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
3 голосов
/ 06 августа 2010

Я думаю 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 - нет. Но это достаточно просто, если вам нужно.

.
0 голосов
/ 06 августа 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
...