哈希键中哪些字符有效?

时间:2009-12-15 10:00:21

标签: perl syntax

根据主题:哈希键中可以使用的字符是什么,如果更短,哪些字符不能使用?

另外,使用长哈希键(如完整路径名)有什么问题吗?

4 个答案:

答案 0 :(得分:19)

有关此主题的讨论,请参阅How Hashes Really Work。简而言之,只要您引用键(非插值q {}),就可以使用您想要的任何字符。

关于Dana的答案,不,不需要更长时间才能获得更长的密钥:对密钥进行散列会花费更长的时间,但这就是全部。

作为参考,这是Perl 5.10.0中的散列函数:

#define PERL_HASH(hash,str,len)
 STMT_START {
    register const char * const s_PeRlHaSh_tmp = str;
    register const unsigned char *s_PeRlHaSh = (const unsigned char *)s_PeRlHaSh_tmp;
    register I32 i_PeRlHaSh = len;
    register U32 hash_PeRlHaSh = PERL_HASH_SEED;
    while (i_PeRlHaSh--) {
        hash_PeRlHaSh += *s_PeRlHaSh++;
        hash_PeRlHaSh += (hash_PeRlHaSh << 10);
        hash_PeRlHaSh ^= (hash_PeRlHaSh >> 6);
    }
    hash_PeRlHaSh += (hash_PeRlHaSh << 3);
    hash_PeRlHaSh ^= (hash_PeRlHaSh >> 11);
    (hash) = (hash_PeRlHaSh + (hash_PeRlHaSh << 15));
} STMT_END

答案 1 :(得分:7)

尚未提出的一点是,您可以使用任何有效的字符串作为哈希键。如果您尝试使用字符串以外的其他内容,它将自动进行字符串化,这意味着,例如,

my $ref = [];
$hash{$ref} = 'foo';

将使用字符串“ARRAY(0xdeadbeef)”(或任何地址)作为哈希键,而不是实际的数组引用。

答案 2 :(得分:6)

您可以使用字符串中有效的任何字符。长度也不是问题。 Perl将处理几乎任何事情:)

答案 3 :(得分:5)

您可以使用散列键中的任何字符---散列键只是一个字符串。但对于某些字符,您需要引用字符串。如果有疑问,只需在关键字旁边加上引号。

$hash{simplekey}                             # fine
$hash{/var/log/auth.log}                     # syntax error --- can't use '/' directly
$hash{"/var/log/auth.log"}                   # quoted string, so can use any character
my $key = "/var/log/auth.log";  $hash{$key}  # variable used, which can contain any character

使用长琴弦尚未使用的长琴键没有特别的问题。