Какие символы допустимы в хэш-ключи?
согласно ТЕМЕ: Каковы символы, которые можно использовать в хэш-ключах или, если он короче, какие из них нельзя использовать?
кроме того, есть ли проблемы с использованием длинных хэш-ключей (например, полные имена путей)?
4 ответов
посмотреть Как Хэши Действительно Работают для обсуждения этой темы. Короче говоря, пока вы цитируете ключ (без интерполяции q {}), вы можете использовать любые символы, которые хотите.
Что касается ответа Даны, нет, для более длинных ключей не потребуется больше времени: потребуется бесконечно больше времени, чтобы хэшировать ключ, но это все.
Для справки, это функция хэширования в 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
один момент еще не поднят, что вы можете использовать любой действительный строка как хэш-ключ. Если вы попытаетесь использовать что-то другое, кроме строки, она будет автоматически stringified, что означает, что, например,
my $ref = [];
$hash{$ref} = 'foo';
будет использовать строку " ARRAY (0xdeadbeef)" (или любой адрес) в качестве хэш-ключа, а не фактической ссылки на массив.
вы можете использовать любой символ, допустимый в строку. Длина тоже не проблема. Perl справится практически со всем :)
вы можете использовать любой символ в хэш-ключ --- хэш-ключ-это просто строка. Но для некоторых символов вам нужно процитировать строку. Если сомневаетесь, просто поставьте кавычки вокруг ключа.
$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
нет особых проблем с использованием длинных клавиш, которых у вас еще нет с длинными строками.