2008-10-20 17 views
12

मैं एक स्थिति है जहाँ मैं एक डेटा संरचना का एक हस्ताक्षर बनाना चाहते हैं:मैं डेटा संरचना का पुनरावर्तनीय हस्ताक्षर कैसे बना सकता हूं?

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

लक्ष्य होना चाहिए कि अगर डेटा संरचना में परिवर्तन तो हस्ताक्षर करना चाहिए।

क्या ऐसा करने का कोई स्थापित तरीका है?

उत्तर

10

ऐसा करने का सबसे अच्छा तरीका Storable जैसे गहरे-संरचना क्रमिकरण प्रणाली का उपयोग करना है। एक ही डेटा के साथ दो संरचनाएं स्टेलेबल आउटपुट के समान ब्लॉब का उत्पादन करती हैं, इसलिए उनकी तुलना की जा सकती है।

#!/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 सेट करने की आवश्यकता है। यह छोटे उदाहरणों में कोई फर्क नहीं पड़ता है, लेकिन यह बहुत बड़े लोगों में महत्वपूर्ण है। –

0

मुझे लगता है कि आप जो शब्द खोज रहे हैं वह "hashing" है।

असल में, आप अपनी डेटा संरचना को उस फ़ंक्शन के माध्यम से डालते हैं जो इससे काफी अद्वितीय मूल्य उत्पन्न करता है। यह मूल्य आपका हस्ताक्षर होगा।

16

मुझे लगता है कि आप जो खोज रहे हैं वह हैश फ़ंक्शन है। मैं इस तरह एक दृष्टिकोण की सिफारिश करेंगे: Digest::MD5

+0

हेहे। 2 मिनट से कम समय में दो वस्तुतः समान उत्तर। – Rik

+0

3 3 मिनट में 3 बनाओ! मुझे लगता है कि इसका मतलब यह हो सकता है कि हमें यह सही मिला है ;-) –

+1

कुंजी $ Storable :: canonical है। इसके बिना, आराध्य तत्वों के आदेश की गारंटी नहीं देता है। –

-5

से

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

समारोह हैश किसी भी हैश समारोह हो सकता है, उदाहरण के लिए समारोह md5 आप एक struct के बजाय किसी चीज़ का इस्तेमाल नहीं कर सकते? इस तरह आप देख सकते हैं कि कोई ऑब्जेक्ट हैश की तुलना किए बिना किसी प्रकार का उदाहरण है, उदाहरण के लिए

+0

डेटा संरचनाओं के लिए 'nfreeze' का उपयोग करना चाहिए और ऑब्जेक्ट्स पर्ल 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(); 
संबंधित मुद्दे