Domanda

Ho una situazione in cui voglio creare una firma di una struttura di dati:

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

L'obiettivo dovrebbe essere quello di modificare la struttura dei dati, quindi anche la firma.

Esiste un modo stabilito per farlo?

È stato utile?

Soluzione

Il modo migliore per farlo è utilizzare un sistema di serializzazione con struttura profonda come riponibile . Due strutture con gli stessi dati produrranno lo stesso BLOB di output memorizzabile, quindi possono essere confrontate.

#!/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 per dimostrare l'inverso:

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

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

Altri suggerimenti

Penso che quello che stai cercando sia una funzione hash. Consiglierei un approccio come questo:

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

L'hash della funzione può essere qualsiasi funzione hash, ad esempio la funzione md5 da Digest :: MD5

Usa Storable :: nstore per trasformarlo in una rappresentazione binaria, quindi calcola un checksum (ad esempio con il modulo Digest).

Entrambi i moduli sono moduli principali.

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

Penso che la parola che stai cercando sia " hashing " .

Fondamentalmente, metti la tua struttura di dati attraverso una funzione che genera un valore abbastanza unico da essa. Questo valore sarebbe la tua firma.

Non puoi usare un oggetto invece di una struttura? In questo modo è possibile vedere se un oggetto è un'istanza di un tipo senza dover confrontare gli hash, ecc.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top