2008-10-20 6 views

답변

10

Storable과 같은 심층 구조 직렬화 시스템을 사용하는 것이 가장 좋은 방법입니다. 동일한 데이터를 가진 두 개의 구조체가 동일한 Stable 출력을 생성하므로 비교할 수 있습니다.

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

$ Storable :: canonical을 true 값으로 설정해야합니다. 작은 예제에서는 중요하지 않지만 훨씬 큰 예제에서는 중요합니다. –

0

찾고있는 단어가 "hashing"이라고 생각합니다.

기본적으로 데이터 구조는 상당히 고유 한 값을 생성하는 함수를 통해 데이터 구조를 지정합니다. 이 값은 서명입니다.

16

당신이 찾고있는 것이 해시 함수라고 생각합니다. 당신이 구조체 대신 객체를 사용할 수 없습니다

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

이 함수 해시 어떤 해시 함수가 될 수있는, 예를 들어, 함수 MD5 Digest::MD5

+0

헤헤합니다. 2 분 안에 두 개의 사실상 동일한 대답. – Rik

+0

3 분 안에 3을 만드십시오! 나는 그것이 우리가 맞았다는 것을 의미 할 수 있다고 생각한다 ;-) –

+1

열쇠는 $ Storable :: canonical이다. 그것없이 Storable은 요소의 순서를 보장하지 않습니다. –

-5

에서 :이 같은 접근 방식을 추천 하시겠습니까? 그런 식으로 해시 등을 비교하지 않고 객체가 유형의 인스턴스인지 확인할 수 있습니다.

+0

데이터 구조와 오브젝트는 Perl 5에서 상호 교환 가능합니다. 오브젝트는 사실 축복받은 데이터 참조입니다. 어느 쪽이든 - 데이터의 내용에 대한 서명을 원합니다. – EvdB

+0

이 접근법의 실제 문제는 그가 데이터를 처리한다는 것입니다. 데이터는 객체의 상태를 유지하는 데 사용되기 때문에 상태가 변경 될 때마다 새 객체를 인스턴스화해야하므로이 접근 방식은 무효화됩니다. – Ovid

7

Storable :: nstore를 사용하여 이진 표현으로 변환 한 다음 체크섬을 계산합니다 (예 : 다이제스트 기준 치수).

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

+0

나는 정확히 그것을하기 위해 나의 코드를 편집했다. 당신과 나는 다시 같은 길을 걷고있다! –

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