Дайджест :: SHA и utf8

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

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

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

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

{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;

любая помощь будет оценена по достоинству.


person smith    schedule 23.01.2014    source источник
comment
Вы не предоставили нам достаточно информации о том, что находится в $record и откуда оно взято, чтобы ответить на ваш вопрос.   -  person cjm    schedule 23.01.2014
comment
запись поступает из db, а ее json закодирован с помощью json encode subrotine   -  person smith    schedule 23.01.2014
comment
Никогда не используйте use bytes;. См. Его документы. /// Непонятно, какие две вещи генерируют разные хэши, так что здесь действительно нечего делать.   -  person ikegami    schedule 23.01.2014
comment
Приведенный выше код не имеет смысла. Вы добавляете одно и то же ($record) в хеш-функцию один раз для каждого поля. Это должно быть $record{$_}?   -  person Rob Napier    schedule 23.01.2014
comment
Кроме того, когда вы говорите, что у вас есть данные UTF-8 в строках, могут ли эти данные UTF-8 быть закодированы в Latin-1 или нет? Поскольку вы не умираете, я предполагаю, что это можно закодировать в Latin-1. Если да, то есть ли причина, по которой вы думаете, что проблема в UTF-8? Работает ли этот код со строками Latin-1?   -  person Rob Napier    schedule 23.01.2014


Ответы (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 } );
person ysth    schedule 23.01.2014