Какие символы допустимы в хэш-ключи?

согласно ТЕМЕ: Каковы символы, которые можно использовать в хэш-ключах или, если он короче, какие из них нельзя использовать?

кроме того, есть ли проблемы с использованием длинных хэш-ключей (например, полные имена путей)?

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

нет особых проблем с использованием длинных клавиш, которых у вас еще нет с длинными строками.