Как создать повторяемую подпись структуры данных?
У меня есть ситуация, когда я хочу создать подпись структуры данных:
my $signature = ds_to_sig(
{ foo => 'bar',
baz => 'bundy',
boing => undef,
number => 1_234_567,
}
);
Цель должна заключаться в том, что если структура данных изменяется, значит, также должна быть подпись.
Существует ли установленный способ сделать это?
Ответы
Ответ 1
Лучший способ сделать это - использовать систему сериализации глубокой структуры, такую как Storable. Две структуры с одними и теми же данными будут иметь тот же самый блок 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;
Ответ 2
Я думаю, что вы ищете хеш-функцию. Я бы рекомендовал такой подход:
use Storable;
$Storable::canonical = 1;
sub ds_to_sig {
my $structure = shift;
return hash(freeze $structure);
}
Функция hash может быть любой хэш-функцией, например функцией md5 из Digest:: MD5
Ответ 3
Используйте Storable:: nstore, чтобы превратить его в двоичное представление, а затем вычислить контрольную сумму (например, с помощью модуля Digest).
Оба модуля являются основными модулями.
Ответ 4
Digest::MD5->new->add(
Data::Dumper->new([$structure])
->Purity(0)
->Terse(1)
->Indent(0)
->Useqq(1)
->Sortkeys(1)
->Dump()
)->b64digest();
Ответ 5
Я думаю, что слово, которое вы ищете, "hashing" .
В принципе, вы помещаете свою структуру данных через функцию, которая генерирует из нее довольно уникальное значение. Это значение будет вашим знаком.
Ответ 6
Вы не можете использовать объект вместо структуры? Таким образом, вы можете увидеть, является ли объект экземпляром типа без сравнения хэшей и т.д.