使用整数作为哈希键是否安全?

时间:2017-07-06 17:54:08

标签: hashmap integer key perl6

将整数用作散列键是否安全?

my %hash;
my $str = ...

for $str.NFC {
    %hash{$_} = ...
}

1 个答案:

答案 0 :(得分:5)

普通Hash强制所有字符串键:

my %a = '1' => 'foo', 2 => 'bar';

say %a.pairs.perl;  # ("1" => "foo", "2" => "bar").Seq

注意第二个键如何成为字符串"2",即使它最初作为整数传递给哈希。
当您进行哈希查找时,下标也会在使用之前自动转换为字符串:

say %a{"2"}.perl;   # "bar"
say %a{2}.perl;     # "bar"

注意下标2如何正确找到带有键"2"的元素。

在Perl 6中明确定义了从整数到字符串的转换,为每个唯一的整数生成一个唯一的字符串,因此您给出的示例很好。

如果您不希望希望将您的Hash密钥转换为字符串,则可以使用声明中的{}表示法覆盖密钥处理:

my %b{Any} = '1' => 'foo', 2 => 'bar';

say %b.pairs.perl;  # ("1" => "foo", 2 => "bar").Seq

say %b{"1"}.perl;   # "foo"
say %b{1}.perl;     # Any

say %b{"2"}.perl;   # Any
say %b{2}.perl;     # "bar"

注意在这种情况下第二个键2如何保持整数,并且使用字符串下标"2"进行查找时找不到它,下标1也找不到它密钥为"1"的条目。

%b{Any}表示"接受任何类型的密钥,而不是强迫他们"。这有时被称为' object Hash'因为它可以从任何对象映射到值。

%b{Int}意味着"只接受Int个密钥,并且不会强迫他们使用"。在这种情况下,如果您尝试使用不属于Int的任何内容,则会出现错误。