문제

데이터 구조의 서명을 만들고 싶은 상황이 있습니다.

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

목표는 데이터 구조가 변경되면 서명이 변경되어야한다는 것입니다.

이 작업을 수행하는 방법이 있습니까?

도움이 되었습니까?

해결책

이를 수행하는 가장 좋은 방법은 저장 가능. 동일한 데이터를 가진 두 구조는 동일한 저장 가능한 출력 덩어리를 생성하므로 비교할 수 있습니다.

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

사용 저장 가능:: nstore를 이진 표현으로 바꾸고 체크섬 (예 : 다이제스트 모듈)을 계산합니다.

두 모듈 모두 핵심 모듈입니다.

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

나는 당신이 찾고있는 단어가라고 생각합니다 "해싱".

기본적으로 데이터 구조를 상당히 고유 한 값을 생성하는 함수를 통해 데이터 구조를 넣습니다. 이 가치는 귀하의 서명입니다.

구조물 대신 물체를 사용할 수 없습니까? 그렇게하면 객체가 해시 등을 비교하지 않고 유형의 인스턴스인지 확인할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top