我如何检查Perl中哈希的完整性?

时间:2011-05-25 17:20:49

标签: perl

我想知道如何从XML文件导入到Perl中时确保散列完好无损?

XML文件包含VMware支持的客户操作系统名称列表及其运行的平台(32位,64位)。

我能想到的最好的方法是创建一个循环并遍历哈希,看看每个密钥是否都有所需的子密钥。

有更好的想法吗?

以下是XML文件的示例,它是一个非常大的文件。

<platforms>
  <asianux-64>
    <name>Asianux 3</name>
    <type>64-bit</type>
  </asianux-64>
  <asianux3>
    <name>Asianux 3</name>
    <type>32-bit</type>
  </asianux3>
  <debian3>
    <name>Debian GNU/Linux 3</name>
    <type>32-bit</type>
  </debian3>
  <debian3-64>
    <name>Debian GNU/Linux 3</name>
    <type>32-bit</type>
  </debian3-64>
  <debian4>
    <name>Debian GNU/Linux 4</name>
    <type>32-bit</type>
  </debian4>
  <debian4-64>
    <name>Debian GNU/Linux 4</name>
    <type>64-bit</type>
  </debian4-64>
  <debian5>
    <name>Debian GNU/Linux 5</name>
    <type>32-bit</type>
  </debian5>
  <debian5-64>
    <name>Debian GNU/Linux 5</name>
    <type>64-bit</type>
  </debian5-64>
</platforms>

** REDO **

好的,让我再试一次,

我有一个XML文件,其中包含支持VMware操作系统的列表。我将XML文件视为一个简单的“数据库”。我的脚本从文件中读取到我脚本中的哈希值。此哈希用于将操作系统名称和平台插入到我的脚本创建的最终输出中。

我的问题是验证XML文件没有被篡改,以防止将文件导入到散列中。

我需要的只是一种验证所需密钥存在的方法。

我在考虑通过哈希查找所需的简单循环就足够了。

我能做得更好吗?

7 个答案:

答案 0 :(得分:2)

正如其他人所说,问题很模糊。我想到了一个选项,使用XML验证来完成任务,这里使用Relax NG

use XML::LibXML;
my $doc = XML::LibXML->new->parse_file('thing.xml');
my $rng = XML::LibXML::RelaxNG->new(string => <<ENDSCHEMA);
<?xml version="1.0"?>
<element name="platforms" xmlns="http://relaxng.org/ns/structure/1.0">
  <zeroOrMore>
    <element>
      <anyName/>
      <element name="name"> <text/> </element>
      <element name="type"> <text/> </element>
    </element>
  </zeroOrMore>
</element>
ENDSCHEMA

$rng->validate($doc);

答案 1 :(得分:2)

好的,如果我理解你的要求,你想检查给定的哈希是否只有一组给定的键。

您可以进行简单的后验证:

my @required_keys = qw( foo bar baz );

my @missing_keys = grep !exists $hash{$_}, @required_keys;

die "Missing some required keys: @missing_keys\n" if @missing_keys;

die "Extra keys found.\n" if @required_keys != keys %hash;

或者您可以使用锁定的哈希来防止插入无效密钥:

use Hash::Util qw( lock_keys );

my %hash;
my @allowed_keys = qw( foo bar baz );

lock_hash( %hash, @allowed_keys );

%hash = parse_config_file();  # Fatal error if a disallowed key is set.

die "Missing some keys\n" if @allowed_keys != keys %hash;

答案 2 :(得分:1)

为什么你不相信导入工作正常?

也许......

将哈希打印为XML和diff?

答案 3 :(得分:1)

在原始文件上使用sha1sum,然后循环哈希并创建一个tmp文件并比较sha1sums。

答案 4 :(得分:1)

如果您有所需密钥的列表,则可以使用exists函数确保所需的密钥确实存在:

my @requiredKeys = qw(foo bar barfoo foobar);
foreach my $key (@requiredKeys) {
   if (not exists $myHash{$key}) {
        print qq(Missing required key "$key"\n);
   }
}

您不必浏览整个哈希 - 只需查找所需的密钥。

答案 5 :(得分:0)

嗯有点原始,但是使用Data::Dumper将哈希内容打印到控制台,并查看它。

答案 6 :(得分:0)

您的编辑表明您要验证XML结构。

您应该关联DTD或XSD并获取perl DTD验证库

http://en.wikipedia.org/wiki/Document_Type_Definition