データ構造の繰り返し可能な署名を作成するにはどうすればよいですか?
-
03-07-2019 - |
質問
データ構造の署名を作成したい状況があります:
my $signature = ds_to_sig(
{ foo => 'bar',
baz => 'bundy',
boing => undef,
number => 1_234_567,
}
);
目的は、データ構造が変更された場合に署名も変更することです。
これを行うための確立された方法はありますか?
解決
これを行う最良の方法は、保存可能。同じデータを持つ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;
他のヒント
探しているのはハッシュ関数だと思います。このようなアプローチをお勧めします:
use Storable;
$Storable::canonical = 1;
sub ds_to_sig {
my $structure = shift;
return hash(freeze $structure);
}
関数ハッシュには、任意のハッシュ関数を使用できます。たとえば、の関数md5 Digest :: MD5
Storable :: nstoreを使用してバイナリ表現に変換してから、チェックサム(Digestモジュールなど)。
両方のモジュールはコアモジュールです。
Digest::MD5->new->add(
Data::Dumper->new([$structure])
->Purity(0)
->Terse(1)
->Indent(0)
->Useqq(1)
->Sortkeys(1)
->Dump()
)->b64digest();
探している言葉は" hashing" です。 p>
基本的に、データ構造から、かなりユニークな値を生成する関数を使用します。この値はあなたの署名になります。
構造体の代わりにオブジェクトを使用できませんか?そうすれば、ハッシュなどを比較することなく、オブジェクトが型のインスタンスであるかどうかを確認できます。
所属していません StackOverflow