Как я могу создать повторяющуюся сигнатуру структуры данных?

StackOverflow https://stackoverflow.com/questions/218531

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

#!/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;

Другие советы

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

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

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

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

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

Digest::MD5->new->add(
  Data::Dumper->new([$structure])
   ->Purity(0)
   ->Terse(1)
   ->Indent(0)
   ->Useqq(1)
   ->Sortkeys(1)
   ->Dump()
)->b64digest();

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top