2014-01-23 3 views
2

У меня есть utf8 данные, которые я прохожу переваривать :: SHA по следующим образом:Digest :: ША и utf8

my $sha1=Digest::SHA->new; 

foreach (@fields) { $sha->add($record)  } 
     print $sha1->hexdigest; 

, но я получаю неожиданное поведение и каждый раз, когда я получаю разные переваривать для той же самой записи я читать дальше http://metacpan.org/pod/Digest::SHA, что есть побочные эффекты использования Digest УВХ с UTF8 я пытаюсь следующий metigation но и не работает:

{use bytes; 

foreach (@fields) { $sha->add($record)  } 
     print $sha1->hexdigest; 
} 

и

use Encode qw(encode_utf8); 
    foreach (@fields) { $sha->add((encode_utf8($record))  } 
     print $sha1->hexdigest; 

любая помощь будет признательна.

+0

Вы гавань» t дал нам достаточно информации о том, что находится в '$ record', и откуда он пришел, чтобы ответить на ваш вопрос. – cjm

+0

запись взята из db и ее json, закодированной подконусом json encode – smith

+0

Никогда не используйте 'use bytes;'. См. Его документы. /// Неясно, какие две вещи генерируют разные хэши, так что на самом деле нечего делать дальше. – ikegami

ответ

1

Не видя ваши фактические данные (например, use Data::Dumper; $Data::Dumper::Useqq=1; print Dumper $record;) и что вы ожидаете от SHA, это очень сложно.

Это говорит, вы можете найти самый простой способ, чтобы получить последовательный алгоритм SHA, чтобы заставить кодировку JSON для вывода только ASCII и убедитесь, что он всегда ставит хэш-элементы в последовательном порядке:

use JSON; 
$serialized = JSON::to_json($data_structure, { 'ascii' => 1, 'canonical' => 1 });