Как я могу создать повторяемую подпись структуры данных? - PullRequest
12 голосов
/ 20 октября 2008

У меня есть ситуация, когда я хочу создать подпись структуры данных:

my $signature = ds_to_sig(
  { foo   => 'bar',
    baz   => 'bundy',
    boing => undef,
    number => 1_234_567,
  }
);

Цель должна состоять в том, чтобы, если структура данных изменилась, изменилась и подпись.

Есть ли установленный способ сделать это?

Ответы [ 6 ]

16 голосов
/ 20 октября 2008

Я думаю, что вы ищете, это хеш-функция. Я бы рекомендовал такой подход:

use Storable;
$Storable::canonical = 1;
sub ds_to_sig {
    my $structure = shift;
    return hash(freeze $structure);
}

Хеш функции может быть любой хеш-функцией, например, функцией md5 из Digest :: MD5

10 голосов
/ 20 октября 2008

Лучший способ сделать это - использовать систему сериализации с глубокой структурой, такую ​​как Storable . Две структуры с одинаковыми данными создадут один и тот же блоб сохраняемого вывода, поэтому их можно сравнивать.

#!/usr/bin/perl

use strict;
use warnings;

use Storable ('freeze');

$Storable::canonical = 1;

my $one = { foo => 42, bar => [ 1, 2, 3 ] };
my $two = { foo => 42, bar => [ 1, 2, 3 ] };

my $one_s = freeze $one;
my $two_s = freeze $two;

print "match\n" if $one_s eq $two_s;

... И доказать обратное:

$one = [ 4, 5, 6 ];
$one_s = freeze $one;

print "no match" if $one_s ne $two_s;
7 голосов
/ 20 октября 2008

Используйте Storable :: nstore, чтобы превратить его в двоичное представление, а затем вычислить контрольную сумму (например, с помощью модуля Digest).

Оба модуля являются основными.

5 голосов
/ 20 октября 2008
Digest::MD5->new->add(
  Data::Dumper->new([$structure])
   ->Purity(0)
   ->Terse(1)
   ->Indent(0)
   ->Useqq(1)
   ->Sortkeys(1)
   ->Dump()
)->b64digest();
0 голосов
/ 20 октября 2008

Разве вы не можете использовать объект вместо структуры? Таким образом, вы можете увидеть, является ли объект экземпляром типа, не сравнивая хэши и т. Д.

0 голосов
/ 20 октября 2008

Я думаю, что слово, которое вы ищете, это "хэширование" .

По сути, вы помещаете свою структуру данных через функцию, которая генерирует из нее довольно уникальное значение. Это значение будет вашей подписью.

...