2015-03-20 2 views
0

Я собираюсь периодически загружать серию хэшей (написанных в JSON) из файла конфигурации, а затем убедиться, что ни одна из них не изменилась.Консистенция данных :: Дампер при строковом хешировании

Таким образом, если файл конфигурации что-то вроде этого:

"sources" : [ 
    { 
     "source_name": "A", 
     "interval" : 6, 
     "params"  : { 
     "what" : "testA" 
     } 
    }, 
    { 
     "source_name": "B", 
     "interval" : 6, 
     "params"  : { 
     "what" : "testB" 
     } 
    } 
    ] 

А потом при следующем запуске он изменил к этому (только поменять местами первые две строки, фактически ничего не изменилось):

"sources" : [ 
    { 
     "interval" : 6, 
     "source_name": "A", 
     "params"  : { 
     "what" : "testA" 
     } 
    }, 
    { 
     "source_name": "B", 
     "interval" : 6, 
     "params"  : { 
     "what" : "testB" 
     } 
    } 
    ] 

Я должен быть в состоянии обнаружить, что ничего не изменилось.

По этой причине я мог бы Digest::SHA строкой хэша. Итак, вопрос в том, соответствует ли Data::Dumper? Например, если я пройду два одинаковых хэша, всегда получаю ли я идентичную строку? Я уже немного поиграл с изменением порядка ключей, и это кажется последовательным; но, конечно, это не доказательство.

А если нет, то какие-либо советы о том, как это сделать?

ответ

2

Я считаю, что Data::Compare - это то, что вы должны использовать.

Итак, вопрос в том, является ли Data: Dumper последовательным? Например, если я пройду два одинаковых хэша, всегда получаю ли я идентичную строку?

Хеши не заказываются, поэтому я не буду полагаться на это, но вы можете сортировать перед печатью, если это то, что вам нужно.

0

Данные: Dumper согласованный?

Нет, если вы не скажете об этом. Вы можете сделать это, установив Sortkeys.

my $dumper = Data::Dumper->new($data); 
$dumper->Sortkeys(1); 
print $dumper->Dump; 

Это потому, что хеши не имеют неотъемлемого порядка. В старых версиях Perl порядок хэшей с теми же наборами ключей был бы согласован, но это уже не является надежным.

В качестве альтернативы вы можете использовать perl5i и его метод diff.

use perl5i::2; 

my $a = { foo => "bar" }; 
my $b = { foo => "barr" }; 

my $diff = $a->diff($b); 
if(keys %$diff) { 
    say "There are differences."; 
    say $diff->mo->as_json; 
} 
else { 
    say "No differences."; 
} 

Или используйте perl5i's meta object checksum способ.

use perl5i::2; 
say "No differences" if $a->mo->checksum eq $b->mo->checksum; 
1

Вы можете использовать $Data::Dumper::Sortkeys = 1;, чтобы убедиться, что ключи были отсортированы, когда дамп;

use Data::Dumper; 

$Data::Dumper::Sortkeys = 1; 
my $hash = {b => 2, a => 1, }; 
print Dumper $hash; 

, если вы хотите, чтобы сравнить два хэшей, имеют ли они ту же структуру, вы можете использовать Test::Deep::NoTest.

use Test::Deep::NoTest; 

my $hash_1 = {a => 1, b => 2 }; 
my $hash_2 = {b => 2, a => 1 }; 
if(eq_deeply($hash_1, $hash_2)){ 
    println "same!\n"; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^