【问题标题】:Perl: Checksum of complex data-structurePerl:复杂数据结构的校验和
【发布时间】:2018-08-06 18:25:27
【问题描述】:

在 Perl 中是否有一个包/函数可以让我以简单的方式提供给我

  • 短信息(例如数字、短字符串)
  • 类似于哈希值/校验和(例如 MD5)
  • 具有良好的区别(例如加密哈希,如 MDx、SHAx)
  • 表示复杂数据结构的内容(例如散列数组的散列)。

我想到的最好的主意是

  1. 将我的结构序列化为字符串(例如,使用 Data::Dumper)

  2. 使用 MDx 对字符串进行哈希处理

但也许还有更优雅的方式。

【问题讨论】:

  • 任何散列都可以,但取决于目的。是“快速”比较两个结构并评估它们是否不同吗? (在这种情况下,如果序列化没有以完全相同的方式完成,您可能会因为结构没有真正的变化而获得不同的哈希值)。
  • 我认为任何校验和都是为了一种比较:-)
  • 视情况而定。如果您仍然含糊不清(不知道大小、速度等的限制),您的答案已经在您的问题中:序列化和散列。但我仍然认为最好的答案取决于这样做的目的。以 CDROM 等物理介质为例:它们有校验和来查看介质是否损坏,但也没有什么可比较的,你只知道它是否正常。一些更复杂的校验和允许您检测和修复(部分)损坏的数据。
  • 注意序列化的一致性(例如,设置$Data::Dumper::Sortkeys),以便相同的输入产生相同的输出。

标签: perl data-dumper


【解决方案1】:

过去,我使用 Data::Dumper(带有排序键,如 @mob 所指)+ Digest::MD5 方法来创建复杂数据结构的校验和。在我的例子中,目的是比较两个或多个数据结构是否相等。

(非常)简单的sn-p:

use Data::Dumper qw( Dumper ) ;
use Digest::MD5 qw( md5_hex) ;

sub digest {
    my $data = shift ;
    local $Data::Dumper::Sortkeys = 1;
    return md5_hex( Dumper($data) ) ;
}

简介:

my $cplx_data_checksum = digest({ 
    c => 1 , 
    b => [ 1 , { a => 2 } ]
}) ;

如需了解 Digest 算法的速度,请查看 https://metacpan.org/pod/Digest#Digest-speed 的 Digest Perl 模块

希望对你有帮助

【讨论】:

  • 你好。请更正您的示例。用于启用键排序的开关是 $Data::Dumper::Sortkeys,而不是 SortKeys(小写“k”与大写“K”)。
【解决方案2】:

我会考虑使用

Sereal Encoder

我用它来解决类似的问题,对此非常满意, 它很快,提供了我能想到需要的所有选项, 并没有花很长时间就开始了。

例如,它允许您选择如何处理对象, 以及是否对哈希键进行排序,这非常有用。

玩得开心!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-24
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多