【问题标题】:Digest::SHA and utf8摘要::SHA 和 utf8
【发布时间】:2014-01-23 18:02:22
【问题描述】:

我有 utf8 数据,我通过以下方式传递给 DIGEST::SHA:

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

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

但我得到了意想不到的行为,每次我在 http://metacpan.org/pod/Digest::SHA 上阅读的同一条记录得到不同的摘要时,使用带有 UTF8 的摘要 SHA 会有副作用 我尝试了以下方法,但都不起作用:

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

任何帮助将不胜感激。

【问题讨论】:

  • 您没有向我们提供有关$record 中的内容及其来源的足够信息,无法回答您的问题。
  • 记录来自db,它的json用json encode subrotine编码
  • 永远不要使用use bytes;。查看它的文档。 /// 不清楚是哪两个东西产生了不同的哈希值,所以真的没什么可做的。
  • 上面的代码没有意义。您为每个字段一次将相同的内容 ($record) 添加到哈希函数中。应该是$record{$_}
  • 另外,当你说你的字符串中有 UTF-8 数据时,这个 UTF-8 数据是否可以编码成 Latin-1?既然你没有死,我假设它可以用 Latin-1 编码。如果是这样,那么您是否有理由认为 UTF-8 实际上是问题所在?此代码是否适用于 Latin-1 字符串?

标签: perl utf-8 digest


【解决方案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 } );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 2012-12-31
    • 2019-04-28
    • 2015-03-24
    相关资源
    最近更新 更多