Ped*_*lva 19
有关此主题的讨论,请参见哈希真正如何工作.简而言之,只要您引用键(非插值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
Run Code Online (Sandbox Code Playgroud)
尚未提出的一点是您可以使用任何有效的字符串作为哈希键.如果您尝试使用字符串以外的其他内容,它将自动进行字符串化,这意味着,例如,
my $ref = [];
$hash{$ref} = 'foo';
Run Code Online (Sandbox Code Playgroud)
将使用字符串"ARRAY(0xdeadbeef)"(或任何地址)作为散列键,而不是实际的数组引用.
您可以在散列键中使用任何字符---散列键只是一个字符串.但对于某些字符,您需要引用字符串.如果有疑问,只需在关键字旁边加上引号.
$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
Run Code Online (Sandbox Code Playgroud)
使用长字符串时尚未使用的长按键没有特殊问题.