Pergunta

Eu tenho uma situação onde eu quero criar uma assinatura de uma estrutura de dados:

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

O objetivo deve ser que, se a estrutura de dados muda, em seguida, assim que se a assinatura.

Existe uma maneira estabelecida de fazer isso?

Foi útil?

Solução

A melhor maneira de fazer isso é usar um sistema de serialização deep-estrutura como armazenável . Duas estruturas com os mesmos dados irá produzir a mesma bolha de saída armazenável, para que eles possam ser comparados.

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

... E para provar o inverso:

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

print "no match" if $one_s ne $two_s;

Outras dicas

Eu acho que o que você está procurando é uma função hash. Eu recomendaria uma abordagem como esta:

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

A função hash pode ser qualquer função hash, por exemplo a função MD5 de Digest :: MD5

Use armazenável :: nstore para transformá-lo em uma representação binária, e depois calcular um soma de verificação (por exemplo, com o módulo de Digest).

Ambos os módulos são módulos principais.

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

Eu acho que a palavra que você está procurando "hashing" .

Basicamente, você coloca sua estrutura de dados através de uma função que gera um valor bastante singular a partir dele. Este valor seria sua signiture.

Você não pode usar um objeto em vez de um struct? Dessa forma, você pode ver se um objeto é uma instância de um tipo sem ter que comparar hashes, etc.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top