plantillas para online imagen gratis generador firmas firma elegantes crear correo con perl data-structures signature

perl - para - ¿Cómo puedo crear una firma repetible de una estructura de datos?



generador de firmas de correo gratis (6)

¿No puedes usar un objeto en lugar de una estructura? De esta forma, podría ver si un objeto es una instancia de un tipo sin tener que comparar hashes, etc.

Tengo una situación en la que quiero crear una firma de una estructura de datos:

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

El objetivo debería ser que si la estructura de datos cambia, entonces también debería hacerlo la firma.

¿Hay una forma establecida de hacer esto?


Creo que la palabra que estás buscando es "hashing" .

Básicamente, pones tu estructura de datos a través de una función que genera un valor bastante único a partir de ella. Este valor sería tu firma.


Creo que lo que estás buscando es una función hash. Yo recomendaría un enfoque como este:

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

La función hash puede ser cualquier función hash, por ejemplo, la función md5 de Digest :: MD5


La mejor forma de hacerlo es usar un sistema de serialización de estructura profunda como Storable . Dos estructuras con los mismos datos producirán la misma cantidad de salida Almacenable, por lo que se pueden comparar.

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

... Y para probar lo contrario:

$one = [ 4, 5, 6 ]; $one_s = freeze $one; print "no match" if $one_s ne $two_s;


Utilice Storable :: nstore para convertirlo en una representación binaria y luego calcule una suma de comprobación (por ejemplo, con el módulo Digest).

Ambos módulos son módulos centrales.


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