12

データ構造の署名を作成したい状況があります。

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

目的は、データ構造が変更された場合に署名も変更する必要があることです。

これを行う確立された方法はありますか?

4

6 に答える 6

16

あなたが探しているのはハッシュ関数だと思います。次のようなアプローチをお勧めします。

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

関数ハッシュは、任意のハッシュ関数にすることができます。たとえば、Digest::MD5の関数 md5 です。

于 2008-10-20T14:05:46.337 に答える
10

これを行う最善の方法は、Storableのような深い構造のシリアル化システムを使用することです。同じデータを持つ 2 つの構造は、Storable 出力の同じ BLOB を生成するため、それらを比較できます。

#!/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;
于 2008-10-20T14:15:53.820 に答える
7

Storable ::nstore を使用してバイナリ表現に変換し、チェックサムを計算します (たとえば、Digest モジュールを使用)。

どちらのモジュールもコア モジュールです。

于 2008-10-20T14:13:30.673 に答える
5
Digest::MD5->new->add(
  Data::Dumper->new([$structure])
   ->Purity(0)
   ->Terse(1)
   ->Indent(0)
   ->Useqq(1)
   ->Sortkeys(1)
   ->Dump()
)->b64digest();
于 2008-10-20T14:26:37.480 に答える
0

あなたが探している言葉は「ハッシュ」だと思います。

基本的に、データ構造を関数に通して、そこからかなりユニークな値を生成します。この値が署名になります。

于 2008-10-20T14:03:34.627 に答える
-5

構造体の代わりにオブジェクトを使用できませんか? そうすれば、ハッシュなどを比較しなくても、オブジェクトが型のインスタンスであるかどうかを確認できます。

于 2008-10-20T14:07:07.287 に答える